TIL

Today I Learned. 知ったこと、学んだことを書いていく

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# でのサンプル

参考文献