今回はエラー処理のお話です。
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などで呼び出し元の実行関数名を取得することもできるので、エラーメッセージやログに活用することもできます。
とりあえず少し走り書きで書きましたが、ここまで。