VB のたまご

作成日: 2015/12/03, 更新日: 2015/12/03


UnhandledException について

概要

  •  一般的に、何かの例外エラーが発生した際に、何処からもエラーをキャッチしないままでいると、プログラムが終了してしまいます。 本来であれば、例外エラーが発生したメソッド内やその近辺で、エラー対処をするべきなのですが、万が一取りこぼしが発生した場合に、 UnhandledException をハンドルすることで、その例外エラーを捕まえることができます。

  •  つまり、UnhandledException 自体は例外エラーとして自然発生するわけではなく、UnhandledException が何らかの例外エラーを受け止めて拾ってくれる役目を担当します。 通常、何も設定をしないと、UnhandledException を捕まえることはできず、イベントとメソッドを紐づけて利用します。

  •  このような最後の砦のような役割を受け持つのが、UnhandledException なのですが、ThreadException という例外エラーも同様に担当しています。 両者の違いは、受け持つスレッドの違いです。 UnhandledException は、別スレッド(バックグラウンド等)上で例外エラー発生した際に、活躍する例外エラーです。 ThreadException は、UI スレッド(通常処理)上で例外エラー発生した際に、活躍する例外エラーです。


スポンサーリンク


事例と対処方法

  •  以下のサンプルは、意図的に例外エラーを発生させるコードです。 実際の業務プログラムでは、このような簡単なコードではないと思いますが、例外発生させている、直接的な原因となる部分として参考になるはずです。 また、本例外エラーが発生してしまう原因となった、根本的な原因となる別の例外エラーが、さらに奥深くにいる場合があります。 (本例外エラーは間接的に影響を受けて発生してしまったもので、本当の原因となる例外エラーを食い止めることで、本例外エラーも直る場合があります。)

  •  このような組み合わせのパターンは、本例外エラーに限らず、他の例外エラー全般にも言えることですが、そんなに頻繁に出くわすものではないと思いますので、 そういう場合もあるということだけ、覚えておいていただけると解決しやすくなるのではと思います。

  •  また、記載の対処方法は、あくまでも一例です。 他の対処方法の方が、その業務プログラムにとってベストプラクティスとなる場合もありますので、検討材料の1つという程度に確認していただければと思います。

  • スポンサーリンク



  • UnhandledException
  • Imports System.Threading
    
    Public Class Form1
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            AddHandler System.AppDomain.CurrentDomain.UnhandledException, AddressOf Me.Application_UnhandledException
    
            Dim t As New Thread(New ThreadStart(AddressOf Me.Calc))
            t.Start()
    
        End Sub
    
        Private Sub Application_UnhandledException(sender As Object, e As UnhandledExceptionEventArgs)
            ' 別スレッド(バックグラウンド等)で例外エラーを補足しなかった時に、UnhandledException がキャッチします。
    
            MessageBox.Show(CType(e.ExceptionObject, Exception).Message, "UnhandledException")
    
        End Sub
    
        Private Sub Calc()
    
            Dim ten As Integer = 10
            Dim zero As Integer = 0
            Dim answer As Integer = CInt(ten / zero)    ' 割り算 OverflowException
    
        End Sub
    
    End Class
    
    ' メッセージ内容
    UnhandledException:算術演算の結果オーバーフローが発生しました。
    
  •  記載のサンプルで、補足されなかった例外エラーを捕まえることができますが、 あるべき姿は、やはり、例外エラー発生したメソッド内かその付近で対処することが妥当かと考えます。早期発見、早期治療みたいな考え方です。

  •  最後までこの記事を読んでいただき、ありがとうございました。

  • スポンサーリンク