14

Webサービスでは、次のコードが表示されます。

<WebMethod()> _
Public Function dosomething() As Boolean
    Try
        If successful Then
            Return True
        Else
            Return False
        End If
    Catch ex As Exception
        Throw ex
    End Try
End Function

例外をキャッチして、もう一度スローすることのポイントは何ですか?私は何かが恋しいですか?

編集:答えてくれてありがとう!そのようなものだと思いましたが、何の影響もなくそれらをリファクタリングできるかどうかはわかりませんでした。

4

9 に答える 9

46

これをしないでください。

どうしても例外を再スローする必要がある場合は、throw;usingを使用するだけthrow ex;でスタックトレースが消去され、絶対に間違っています。

于 2008-12-03T12:02:25.290 に答える
15

機能性のためにこれを行う理由は考えられません。ただし、以前に削除されたエラー処理(通常はロギング)があり、開発者がログ処理を削除したが、冗長なtry/catchを削除するようにコードを再構築しなかった場合に発生する可能性があります。

于 2008-12-03T11:55:52.477 に答える
5

おそらく、デバッグから残ったコードが少し残っています(デバッガーで例外を調べることができるように、スローにブレークポイントを設定します)。例外をログに記録してからチェーンに渡す場合は、このようなことを行う可能性がありますが、おそらく、より意味のある(アプリケーションにとって)エラーメッセージを使用して例外を別の例外にラップします。

于 2008-12-03T11:58:55.843 に答える
4

これが使用されているアーキテクチャ(設計パターン)の 1 つは、トランザクションが処理される場所です。関数はその作業を実行して失敗し、catch ブロックはトランザクションを既知の状態 (通常はロールバック) まで完了してから、ユーザー定義の例外をスローします。

現状では、そのコードをより健全な状態にリファクタリングしてください。

于 2008-12-03T12:30:28.447 に答える
0

Monitor.Exit が呼び出されることを確認するために finally が必要なため、Monitor のパターンにより、エラーが再スローされる可能性が非常に高くなります。

https://msdn.microsoft.com/en-us/library/4tssbxcw(v=vs.110).aspx

Dim lockObj As New Object()

If Monitor.TryEnter(lockObj) Then
    Try
        ' The critical section.
    Catch
       throw
    Finally
       ' Ensure that the lock is released.
       Monitor.Exit(lockObj)
    End Try
End If
于 2016-05-20T12:43:20.940 に答える
-9

サブクラス以外の例外をキャッチしたい場合は、それを行うことができます。

例えば、

try {
    // Something stupid
}
catch(RuntimeException e) {
    throw e; //Handle it outside
}
catch (Exception e) {
    // I'm dead
}
于 2008-12-03T12:13:41.927 に答える