VB.NETの例外処理 - VB.NET
例外処理について調べてみた時の走り書き!
Javaには業務エラーを処理する検査例外があるので半ば強制的に例外をキャッチなりスローしなければいけませんが、.Net にはJavaの検査例外にあたるものがないので、業務エラーは原則戻り値で処理する設計になっています。従って、.Netでは余程のことが無い限り 処理中で例外をキャッチする必要はないし、することはお作法に反することになるのです。業務エラーは事前にチェックし、その戻り値でフローを制御する必要があるのです。
VB.NETではcatchしなくてもコンパイルエラーにならないため、別にTry-Catchで囲まなくてもよいのでは!?
もしくは、ログはいて、Throwするだけ?
集約例外ハンドラでログはく設定にしておけば、catchしなくてもよさそうだけど→集約例外ハンドラでログはけばいけたから、catchもしなくていい
- try-catchは、基本的に業務エラーに変換するときとかロールバックするとき以外は書かない!!
- try-finallyで十分。tryって書いたらcatchって書かないといけないことなんてない!!catchは書かなくていいの!!!
例1)ロールバックしたい場合
Try ' ロールバックしたい処理 Catch ex As SqlException ' ロールバック ' 必ずThrow Throw Finally ' クローズ処理
例2)業務エラーに変換したい場合
Try ' 業務エラーに変換したい例外が発生する可能性のある処理 Catch ex As Exception If ex.Number = 2627 Then ' 業務エラーに変換 MsgBox("重複エラー!") End If Finally ' クローズ処理
これ以外にもたくさんあると思うけど、今はこれくらいしかわからない
検査例外
Javaにはあるけど、ほとんどの言語には存在しないもの
catchしないとコンパイルエラーになる例外
発生しうる例外の表明、発生しうる例外の保証
呼び出し側の責任ではない例外
非検査例外
catchしなくてもコンパイルエラーにならない例外
呼び出し側の責任の可能性がある例外
検査例外と非検査例外 | hydroculのメモ によると以下のように記述されている
ほとんどの言語では検査例外というのはなく、宣言なしに例外をスローすることができる
リソースの開放はどうする?
Using
構文を使うことで対処できる!?
コンパイラが Try-Finally に変換してくれるらしい
例外処理を1か所に記述する
集約例外ハンドラというものがあるらしい
Scribbled Records - .Net Framework 例外処理の基本 集約例外ハンドラ(Windows フォーム) C# でのサンプル
参考文献
- Javaの検査例外は、呼び出し側の責任でない異常系 - Qiita
- ITとの生活:.Netの例外処理について: IT,車,不動産との生活
- 構造化例外処理 | ITツールの使い方
- 検査例外と非検査例外 | hydroculのメモ
- 検査例外再考 - Qiita
- C# - 例外・ログメッセージ管理のプラクティス(100534)|teratail
- Windowsフォーム開発で思ったこと - Life is Really Short, Have Your Life!!
- Scribbled Records - .Net Framework 例外処理の基本 集約例外ハンドラ(Windows フォーム) C# でのサンプル
- Scribbled Records - .Net Framework 例外処理の基本 走り書き
- 例外のデザインのガイドライン
- 例外処理。Try Catch、Try Finally、既定例外の基本的な動きと特性の理解。(UnhandledException,ThreadException) - tekkの日記 C#,VB.NET