今回はエラー処理のお話です。
- 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
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関数処理
A関数処理
AA関数処理
AAA関数処理
AA関数処理
A関数処理
AAA関数でエラーが発生した場合、AAの後の処理は行ってはいけないわけです。 行わないように
- If Not AAA() Then
- Return False
- End If
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
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などで呼び出し元の実行関数名を取得することもできるので、エラーメッセージやログに活用することもできます。
とりあえず少し走り書きで書きましたが、ここまで。