GetBaseException Try Catch Finally End Try 例外の主要原因探し


VB Tips And Sample(HOME)(VB.NET Sample インデックス)

オーバフローの場合だけの例外処理で・・・・・など、エラーによって処理を分岐させたい場合、どのエラーでキャッチできるか調べる必要があります。
その場合、GetBaseExceptionが使えるようです。


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim X, Y, Z As Short
RE:
        Try
            X = 32767
            Y = 1
            Z = X + Y 'わざとオーバフローを起こす
        Catch eo As System.OverflowException 'オーバフロー=System.OverflowExceptionを調べるの方法
            'オーバフローの場合に入って来る
            'オーバーフロのエラーがSystem.OverflowExceptionである事を調べるには
            'eo.GetBaseException.ToStringを使用する。
            'EO:System.OverflowException: 算術演算の結果オーバーフローが発生しました。~ 行目など
            'と取得できる。
            MSより→ある例外の主要原因を見つける必要があるが、その例外から現在の例外までの間に発生した例外に関する情報は不要な場合には、GetBaseException メソッドを使用します。
            Debug.WriteLine("EO:" & eo.Message.ToString)
            Debug.WriteLine("EO:" & eo.GetBaseException.ToString)
            MessageBox.Show("EO:" & eo.Message.ToString)
            MessageBox.Show("EO:" & eo.GetBaseException.ToString)
            GoTo RE 'オーバフローの場合には「RE:」へ飛ぶ必要がある場合はこのように書く。
            'MSより→GoTo ステートメントを使用すると、プログラムが読みにくくなり、保守が困難になります。可能な限り、制御構造を使うようにしてください。

        Catch ex As Exception
            Debug.WriteLine(ex.Message.ToString)
            Debug.WriteLine(ex.GetBaseException.ToString)
            MessageBox.Show(ex.Message.ToString)
            MessageBox.Show(ex.GetBaseException.ToString)
        Finally
            'オブジェクトの破棄など 必ず行う処理を書く
            'MSより→省略可能です。Try ステートメントから抜けるときには、必ず Finally ブロックが実行されます
            MessageBox.Show("エラー有無にかかわらず必ず実行")
        End Try
    End Sub



VB Tips And Sample(HOME)(VB.NET Sample インデックス)