VB.NETの最近のブログ記事

昨日の夜は動いていたのに今朝動かしたら何故かプログラムがコケた。んなバカナーと思ってコード漁ったら
↓コイツが原因だった。
Format(Now, "yyyy/mm/dd hh:mm:ss")

.NETで月を指定する場合、MMにしなければならない。
ログも漁ってみたら、昨日の最後に動かしたのは21時12分。
なんという偶然か。あと一分遅く動かしてたら、昨日の時点でおかしいことに気づいたのに。

逆にVB6はなんでこんなんで動いてたんだ?と思い調べたら
VB6のFormat関数はmmの付近にhhやssがあるかないかで分かどうか判断するという無駄に賢い仕様のようだ。余計なお世話だい。

[2009/05/10 追記]
時刻がhhだと12時間表記なので24時間表記にしたければHHにしなければならない。
#リファレンス開いて一回は確認しないと駄目だな....。

再びVBに戻る日々。
↓のようなソースに出くわしたが、どーゆう意味をもつ構文か分からなかったので調べた。
カギ括弧(大括弧)でくくると変数名、又は関数名として予約語も使えるようになるらしい。

そもそも予約語で命名なんかそうそうせんだろうと思ったが
634 - VB.NET - 予約語一覧
frameworkを作ろうとしたらいくつか使いたいようなものもあるな...。

---
#記号表記による文法定義ってすげー調べづらいよなぁ。

仕事でVB.NETを使うようになり、カッコ閉じるのがメンドイJavaみたいなものだなーと思ってたら例外処理ではまったのでメモ。
基本的に何らかの障害が発生しても原因箇所が特定しやすくなるようにスタックトレース(メソッドやサブルーチンの呼び出し履歴)は残しておきたいものだが、何故かスタックトレースが関数呼び出しの浅い部分までしか追えなかったので原因を調べた。

調べてみたら、どうやらVB.NETにはVB.NET流の書き方があるようだ。


・catchした例外オブジェクト(ex)をThrow exで投げるとスタックトレースが上書きされる。
Javaっぽく、ついThrow exと書くとスタックトレースが新たに上書きされちゃうので、最後に例外をThrowしたところまでしか追えない。これでは問題が発生したときに非常に困る。

VB.NETでは上位層にcatchした例外を投げたかったらThrowのみを使う。
これだと最初にThrowした場所の特定が出来る。
しかし、tryの中のドコでコケたのかは分からないまんまだ。(tryのスコープが十分に小さければ特定は容易なのだが...)


本当に例外が発生した箇所を記録に残したければ

Try
  '例外が発生しそうな処理
Catch ex As HogeHogeException
  Dim fex As FugaFugaException = New FugaFugaException("err_msg", ex )
  '例外処理
  Throw fex 
End Try

みたいな感じで新しく例外オブジェクトを作ってそいつ(fex)のInnnerExceptionにcatchした例外オブジェクトを突っ込めばok。(コンストラクタの第2引数)
これでInnnerExceptionのスタックトレースまで見るようにすれば本当のエラー箇所まで特定できるようになる。


それにしても最後に;打たなくても良い言語は肌に合わない。
慣れの問題だろうが、ついクセで;を打ってしまいああー( ´△`)となる

このアーカイブについて

このページには、過去に書かれたブログ記事のうちVB.NETカテゴリに属しているものが含まれています。

前のカテゴリはPerlです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

OpenID対応しています OpenIDについて
Powered by Movable Type 7.9.3