2011年1月17日月曜日

【VB.NET】ExitException

今回はエラー処理のお話です。


Public Function A()
        Try
            If Not AA() Then
                Return False
            End If

            ' なんらかの処理

        Catch ex As Exception
            MessageBox.Show("A にてエラーが発生しました。", "エラー発生", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Return False
        End Try

        Return True
    End Function

    Public Function AA() As Boolean
        Try
            If Not AAA() Then
                Return False
            End If

            ' なんらかの処理

        Catch ex As Exception
            MessageBox.Show("AA にてエラーが発生しました。", "エラー発生", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Return False
        End Try

        Return True
    End Function

    Public Function AAA() As Boolean
        Try

            ' なんらかの処理

        Catch ex As Exception
            MessageBox.Show("AAA にてエラーが発生しました。", "エラー発生", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            Return False
        End Try

        Return True
    End Function
つまりこんな感じの処理です。
A関数処理
 AA関数処理
  AAA関数処理
 AA関数処理
A関数処理
AAA関数でエラーが発生した場合、AAの後の処理は行ってはいけないわけです。 行わないように
If Not AAA() Then
                Return False
            End If
と記述し、エラーの場合は即座に親関数に戻しています。

私はこの記述が面倒くさいと考えました。

面倒な理由は

・ If Not ~ という記述を毎回行わないといけない。
・ エラーメッセージの記述が面倒。メンテナンスも面倒。


そこで考案した方法は、
Public Class ExitException
        Inherits Exception
        Public Sub New(Optional ByVal ErrMsg As String = "エラーが発生しました。")
            MyBase.New(ErrMsg)
        End Sub
        Public Sub New(ByVal ErrMsg As String, ByVal ex As Exception)
            MyBase.New(ErrMsg, ex)
        End Sub
    End Class

    Public Function A()
        Try
            Call AA()

            ' なんらかの処理

        Catch ex As Exception
            ErrMsg(ex, "A にてエラーが発生しました。")
            Throw New ExitException
        End Try

        Return True
    End Function

    Public Function AA() As Boolean
        Try
            Call AAA()

            ' なんらかの処理

        Catch ex As Exception
            ErrMsg(ex, "AA にてエラーが発生しました。")
            Throw New ExitException
        End Try

        Return True
    End Function

    Public Function AAA() As Boolean
        Try

            ' なんらかの処理

        Catch ex As Exception
            ErrMsg(ex, "AAA にてエラーが発生しました。")
            Throw New ExitException
        End Try

        Return True
    End Function

    Public Sub ErrMsg(ByVal ex As Exception, Optional ByVal Message As String = "")
        If TypeOf ex Is ExitException Then
            Exit Sub
        Else
            If Message = "" Then
                ' メッセージを指定していない場合
                Message = "不正なエラーが発生しました。"

                ' 実行関数名取得してメッセージに含める。これに関してはまた改めて・・
            End If

            MessageBox.Show(Message, "エラー発生", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

        End If

    End Sub
です。 まず、 if Not ~ の記述がなくなっています。

そして共通エラークラスとして ExitException というのが増えており、 ErrMsgという共通関数が増えています。

ExitException ・・・ 発生した場合、エラーメッセージを表示しないエラー。素通りのエラー。
ErrMsg     ・・・ エラーメッセージを表示する関数。ログ書き込みとかもここで実装していいかもしれません。
クラス化してログ書き込みパラメータとかにするともっといいかもしれませんね。

Throw New ExitException を実行するとエラーメッセージを出さずに親の関数にエラーを通知できると考えれば良いと思います。

また、ErrMsgなどで呼び出し元の実行関数名を取得することもできるので、エラーメッセージやログに活用することもできます。


とりあえず少し走り書きで書きましたが、ここまで。

 

0 件のコメント:

コメントを投稿