|
■No46772 (へらぶな さん) に返信
> 例えば下記のようにHOGECがFinally文とともに
> 追加になると、話は変わってきますでしょうか?
やりたいことは、
>> (1)エラーのメッセージボックスは呼び出し元で一括管理したい。
>> (HOGE,HOGEA,HOGEBにメッセージボックスをつけたくない)
>> (2)発生した例外をそのままスローしても、エラーメッセージがわかりにくいため、
>> 独自のエラーメッセージをスローしたい。
でしたよね。
上記を実現するに当たり、今回のコードでは、内側の Catch と外側の Catch とで、
それぞれ何の処理を担当させようとしているのでしょうか?
今回( No46772 )のコードでは、個々の Catch 文で再スローしか行われていないため、
Try
HOGEA() 'DBのオープン処理
HOGEB() 'SQL文の実行
Finally
HOGEC() 'DBのクローズ処理
End Try
と大差無いように見えました。(「Throw」と「Throw ex」の差はありますが)
また、外側の Catch 句で、個々の例外を Catch していますが、この場合
Catch ex As HOGEAException
MsgBox("データベースに接続できませんでした。管理者に連絡してください。", vbCritical)
Catch ex As HOGEBException
Trace.WriteLine(ex.GetType().FullName)
Trace.WriteLine(ex.Message)
Trace.WriteLine(ex.SQL)
Trace.WriteLine(ex.StackTrace)
Throw
などの個別記述が必要になってしまう気がしますが、それは
> (1)エラーのメッセージボックスは呼び出し元で一括管理したい。
> (HOGE,HOGEA,HOGEBにメッセージボックスをつけたくない)
の要件を満たせているのでしょうか?
で、もしも
> (2)発生した例外をそのままスローしても、エラーメッセージがわかりにくいため、
> 独自のエラーメッセージをスローしたい。
のメッセージ変換を、外側の Catch だけで行えるのであれば、内側の Catch 句は
不要だと思います。もし二重に使うにしても、それは別の目的に使う場合だけかと。
Try
Try
HOGEA() 'DBのオープン処理
Catch ex As HOGEAException
Trace.WriteLine(ex.ServerName & "に接続失敗、セカンダリに接続")
HogeA2() 'リカバリー処理(代理DBのオープン)
End Try
Try
HOGEB() 'SQL文の実行
Catch ex As HOGEBException
SQLLog(ex) '失敗した SQL をログに記録しておく
Throw 'リカバリー不能なので上位に再スロー
End Try
'Catch ex As HOGEException 'HOGEAException/HOGEBExceptionの継承元クラス
' ShowMessage(ex) 'Exception の内容に応じて「わかりやすいメッセージ」を表示するメソッド
Finally
HOGEC() 'DBのクローズ処理
End Try
あるいはその逆に、
> (2)発生した例外をそのままスローしても、エラーメッセージがわかりにくいため、
> 独自のエラーメッセージをスローしたい。
のメッセージ変換を、(外側ではなく)内側の Catch 句にて行わせたいのであれば、
GOD さんが No46778 で書かれたように、InnerException を使って Throw し、
それを外側で処理するというのもひとつの手かと思います。
|