仕事で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のスタックトレースまで見るようにすれば本当のエラー箇所まで特定できるようになる。
それにしても最後に;打たなくても良い言語は肌に合わない。
慣れの問題だろうが、ついクセで;を打ってしまいああー( ´△`)となる