DOBON.NET DOBON.NETプログラミング掲示板過去ログ

例外エラーが発生した時に、以降の処理を実行しない方法は?

環境/言語:[vb.net 2010]
分類:[.NET]

例外エラーが発生した時に、以降の処理を実行しない方法は?

お世話になってます。
さっそくですが、ご質問です。

メイン処理(subMain)から各処理(subHoge1⇒subHoge2⇒・・・)を呼び出し処理するPGがあります。

subHoge1にて例外エラーが発生した場合、Catchの中で例外対応処理(subErr)を実行した後で
subhoge2以降の処理を実行させない方法はありますか?

GotoにてsubMainの一番最後に飛ばせばいいのかなと思いましたが、邪道な感じがしますので
何か手段があればご教授ください。

以下、サンプルソース。

Private sub subMain()
Try
subHoge1()
subHoge2()
・・・
Catch ex As Exception
'例外対応処理
subErr()
End Try
End Sub


Private sub subHoge1()
Try
・・・(例外エラーが発生する処理)・・・
Catch ex As Exception
'例外対応処理
^ subErr()
End Try
End Sub

Private sub subErr()
・・・(例外対応処理)・・・
End Sub
subHoge1()で例外が発生したら、例外処理をした後、例外をスローしてあげて、
subMain()でスローした例外をキャッチすることにより、
subMain()で呼びだしているsubHoge2()以下を実行することなくEnd Tryまで飛ばすことができます。
もし、subMain()で、「これはsubHoge1()で発生した例外だよ」ということを知らせるのであれば、
例えば、Exceptionクラスや、それを継承したApplicationExceptionクラスを継承して独自の例外クラスを作り、
それをスローする、とうい方法はどうでしょう。
■No29831に返信(なまちゃさんの記事)

Private Function subHoge1() as Boolean
Try
    ・・・(例外エラーが発生する処理)・・・
    Return True
Catch ex As Exception
'例外対応処理
    subErr()
    Return False
End Try
End Sub

としてFalseが帰ってきたらsubMainを終了するとか、


Private sub subHoge1()
Try
    ・・・(例外エラーが発生する処理)・・・
Catch ex As Exception
    '例外対応処理
    subErr()
    Throw ex
End Try
End Sub

として例外を再発生させsubMainのTryCatchにとばす
など。2番の場合、subMainで発生した例外でないことを区別するため
別のExceptionを作成することも必要かもしれません。
> subhoge2以降の処理を実行させない方法はありますか?

エラーが発生した場合その後の処理を一切実行させなくていいのでしたら

Endステートメントで終了したらどうでしょうか?
ずっかさん、shuさん

ご回答ありがとうございます。
ご助言の通り「Throw ex」でエラーを上げていこうと思います。
ありがとうございました。


以下、修正サンプルソース。


Private strMethodName as String

Private sub subMain()
Try
subHoge1()
subHoge2()
・・・
Catch ex As Exception
subErr(ex)
End Try
End Sub


Private sub subHoge1()
Try
'メソッド名を記憶
strMethodName &= System.Reflection.MethodBase.GetCurrentMethod().Name & ":"

・・・(例外エラーが発生する処理)・・・
Catch ex As Exception
Throw ex
End Try
End Sub

Private sub subErr(ex As Exception)
・・・(例外対応処理)・・・

MsgBox("例外発生メソッド:" & strMethodName & vbcrlf & ex.Message)
End Sub
Mira様

ご回答ありがとうございます。

ENDも考えていましたが、例外処理が終わった途端に画面も落ちてしまうという事で除外していました。

これで回答済みとさせて頂きます。
皆様、ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板