13 Stimmen

Warum eine Ausnahme abfangen, nur um sie erneut auszulösen?

In einem Webservice sehe ich diesen Code:

<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

Welchen Sinn hat es, die Ausnahme abzufangen und sie einfach erneut zu werfen? Verpasse ich etwas?

Bearbeiten: Danke für die Antworten! Ich dachte, es war so etwas wie das, aber war nicht sicher, ob ich könnte/würde refactor diese weg ohne Auswirkungen.

1voto

Nathan Punkte 678

Aus Microsofts CodeAnalysis: (CA2200: Rethrow, um Stack-Details zu erhalten)

"Sobald eine Ausnahme ausgelöst wird, ist ein Teil der Informationen, die sie trägt, der Stack-Trace. Der Stacktrace ist eine Liste der Methodenaufrufhierarchie, die mit der Methode beginnt, die die Ausnahme auslöst, und mit der Methode endet, die die Ausnahme abfängt. Wenn eine Ausnahme erneut ausgelöst wird, indem die Ausnahme in der throw-Anweisung angegeben wird, wird der Stack-Trace bei der aktuellen Methode neu gestartet und die Liste der Methodenaufrufe zwischen der ursprünglichen Methode, die die Ausnahme ausgelöst hat, und der aktuellen Methode geht verloren. Um die ursprünglichen Stack-Trace-Informationen mit der Ausnahme zu erhalten, verwenden Sie die throw-Anweisung ohne Angabe der Ausnahme."

  Sub CatchAndRethrowImplicitly()
     Try
        ThrowException()
     Catch e As ArithmeticException
        ' Satisfies the rule.
        Throw
     End Try
  End Sub

https://docs.microsoft.com/en-us/visualstudio/code-quality/ca2200-rethrow-to-preserve-stack-details?view=vs-2019

0voto

ROBERTREAD1 Punkte 11

Das Muster für Monitor macht es sehr wahrscheinlich, dass ein Fehler zurückgeworfen wird, da Sie ein finally benötigen, um sicherzustellen, dass Monitor.Exit aufgerufen wird

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

0voto

Chase Punkte 154

Es gibt sehr gute Gründe, dies zu tun, insbesondere in einer Full Stack/N Tier-Umgebung.

Es wäre sinnvoll, Ihren Code in Ihrer Klassenbibliothek zu versuchen/abzufangen, die Ausnahme zu protokollieren und sie an die aufrufende Anwendung zurückzugeben, damit der Aufrufer Ausnahmen so behandeln kann, wie er möchte.

Denken Sie daran, dass in einer Full-Stack-Umgebung die Stacks unabhängig sein sollten und nichts von den inneren Funktionen der anderen wissen sollten, ebenso sollten sie nicht davon ausgehen, dass sie die Art und Weise kennen, wie ein Stack außerhalb seiner selbst gefangene Ausnahmen behandeln möchte. Eine Ausnahme in Echtzeit zu behandeln und dann an den Aufrufer weiterzugeben, ist eine sehr hilfreiche Sache.

Und verwenden Sie immer nur "Werfen", nicht "Werfen ex". Throw wirft die Handles-Exception zurück, wobei der Stack intakt bleibt.

-9voto

Dennis C Punkte 23918

Sie können dies tun, wenn Sie eine Ausnahme mit Ausnahme einer Unterklasse davon abfangen möchten.

Zum Beispiel,

try {
    // Something stupid
}
catch(RuntimeException e) {
    throw e; //Handle it outside
}
catch (Exception e) {
    // I'm dead
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X