26 Stimmen

Ignorieren von Ausnahmen in C#

Gibt es einen besseren Weg, um eine Ausnahme in C# zu ignorieren, als es in einem Try-Catch-Block zu setzen und nichts in catch zu tun? Ich finde diese Syntax zu umständlich. Kann ich einen Codeblock nicht einfach so "markieren", dass die Laufzeitumgebung weiß, welche Ausnahmen zu ignorieren sind?

1 Stimmen

Ich weiß, dass das Ignorieren von Ausnahmen eine schlechte Programmierpraxis ist, aber das ist nicht meine Frage. Ich sehe keinen Sinn darin, einen leeren Catch-Block zu haben, daher die Frage.

34voto

Dror Helper Punkte 29647

Ich glaube nicht, dass es einen Trick gibt, um die Ausnahme zu vermeiden, aber Sie können den folgenden Codeschnipsel verwenden:

public void IgnoreExceptions(Action act)
{
   try
   {
      act.Invoke();
   }
   catch { }
}

Die Anwendung der Methode sieht so aus:

IgnoreExceptions(() => foo());

Eine andere Lösung ist die Verwendung von AOP (Aspect Oriented Programming) - es gibt ein Tool namens PostSharp die es Ihnen ermöglicht, ein Attribut zu erstellen, das alle Ausnahmen in einer bestimmten Assembly/Klasse/Methode abfängt, was dem, was Sie suchen, näher kommt.

8 Stimmen

@Dror eine gute Idee. Beachten Sie jedoch, dass Ihr Code einen subtilen Fehler enthält: Die CLR erlaubt tatsächlich cualquier Wert geworfen werden soll, nicht nur Objekte vom Typ Exception (diese Einschränkung wird nur von C# durchgesetzt). Sie sollten also Ihre catch Block als einfach: catch { } Andernfalls könnten bestimmte ungewöhnliche Ausnahmen tatsächlich zum Aufrufer zurückkehren! -- Siehe z.B. dieser Blog-Artikel (etwa zwei Seiten weiter unten) als Referenz.

0 Stimmen

(Ich habe es jetzt korrigiert. Ich habe die Gelegenheit genutzt, als ich einen weiteren Tippfehler in Ihrem Code entdeckte, den ich ebenfalls korrigiert habe. Ich hoffe, es macht Ihnen nichts aus.)

2 Stimmen

Warum nicht act() anstelle von act.Invoke() verwenden?

6voto

Snowbear Punkte 16623

Sie können es mit AOP machen. Mit Postsharp zum Beispiel kann man leicht ein solches Attribut implementieren, das bestimmte Ausnahmen in Methoden überspringt, auf die man ein solches Attribut anwendet. Ohne AOP sehe ich keine gute Möglichkeit, das zu tun (wenn wir davon ausgehen, dass es eine gute Möglichkeit gibt, solche Dinge zu tun ;) ).

Mit Postsharp können Sie Ihre Methoden auf diese Weise ausschmücken:

[IgnoreExceptions(typeof(NullReferenceException), typeof(StackOverflowException))]
void MyMethod() { ... }

4voto

Jason Evans Punkte 28439

Eine Möglichkeit besteht darin, die Vorteile der aspektorientierten Programmierung (AOP) zu nutzen. Werfen Sie einen Blick auf PostSharp . Ici ist ein Beispiel für die Verwendung eines Ausnahmeattributs für eine Methode, so dass Sie im Falle einer Ausnahme diese ohne einen try..catch-Block behandeln können.

EDITAR:

Ach ja, Drors Vorschlag ist auch gut. Ich habe Beispiele dafür in der Enterprise Library gesehen. Das wäre besser, wenn Sie nicht möchten, dass ein Drittanbieter-Framework in Ihrem Projekt (z. B. PostSharp) hat.

3voto

bbrik Punkte 2826
    public static void Ignore<T>(Action a) where T : Exception
    {
        try
        {
            a();
        }
        catch (T)
        {
        }
    }

Zu verwenden:

    Ignore<InvalidOperationException>(() => foo());

2voto

ShdNx Punkte 3114

Ich kenne keinen Mechanismus, mit dem dies möglich wäre.

Im Allgemeinen wird es auch als eine sehr schlechte Praxis angesehen, Ausnahmen zu ignorieren. Ausnahmen werden (oder sollten immer) aus einem guten Grund ausgelöst; wenn schon nichts anderes, dann sollten Sie sie wenigstens protokollieren.

Wenn Sie wissen, dass eine bestimmte Art von Ausnahme für Ihre Anwendung nicht kritisch ist, können Sie den Absturz verhindern, indem Sie die Application.UnhandledException Ereignis, das auf diese Art von Ausnahme überprüft. Beachten Sie, dass dadurch die Ausnahme weiterhin durch alle Stack-Frames bis ganz nach unten propagiert wird.

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