Javaと同じノリで例外を投げたらスタックトレースが吹っ飛んだでござるの巻

| コメント(0) | トラックバック(0)

仕事で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のスタックトレースまで見るようにすれば本当のエラー箇所まで特定できるようになる。


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

トラックバック(0)

トラックバックURL: http://hoge.sub.jp/blog-cgi/mt/mt-tb.cgi/762

このブログ記事について

このページは、Lyoが2008年9月 9日 23:34に書いたブログ記事です。

ひとつ前のブログ記事は「銀行の時間外ATM、コンビニATMの手数料をタダに。」です。

次のブログ記事は「ふつうのhaskellプログラミング読了」です。

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

月別 アーカイブ

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