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.

2voto

Doug Clutter Punkte 3512

Ich wollte die Erweiterungsmethoden beisteuern, die ich auf der Grundlage früherer Antworten entwickelt habe. Ich hoffe, es hilft jemandem.

/// <summary>
/// Extension methods for <see cref="Action"/> objects.
/// </summary>
public static class ActionExtensions
{
    /// <summary>
    /// Executes the <paramref name="action"/> and ignores any exceptions.
    /// </summary>
    /// <remarks>
    /// This should be used in very rare cases.
    /// </remarks>
    /// <param name="action">The action to execute.</param>
    public static void IgnoreExceptions(this Action action)
    {
        try { action(); }
        catch { }
    }

    /// <summary>
    /// Extends an existing <see cref="Action"/> so that it will ignore exceptions when executed.
    /// </summary>
    /// <param name="action">The action to extend.</param>
    /// <returns>A new Action that will ignore exceptions when executed.</returns>
    public static Action AddIgnoreExceptions(this Action action)
    {
        return () => action.IgnoreExceptions();
    }
}

Und die Einheitstests:

[TestClass]
public class ActionExtensionsTests
{
    [TestMethod]
    public void IgnoreException()
    {
        Action justThrow = () => { throw new InvalidOperationException(); };
        justThrow.IgnoreExceptions();
    }
    [TestMethod]
    public void AddIgnoreException()
    {
        Action justThrow = () => { throw new InvalidOperationException(); };
        var newAction = justThrow.AddIgnoreExceptions();
        newAction();
    }
}

1voto

Quick Joe Smith Punkte 7836

Nein. Wenn Ausnahmen auftreten, wandern sie entweder den Aufrufstapel hinauf, bis sie von einem catch Block oder der gesamte Prozess bricht ab.

0voto

Matias Bjørling Punkte 504

Nein. Wenn eine Ausnahme ausgelöst wird, handelt es sich in der Regel um einen kritischen Fehler, der aufgetreten ist. Sie sollten ihn nicht ignorieren.

Stattdessen sollten Sie Ihren Code so umschreiben, dass er auf Fehler prüft, und nur wenn er wirklich fehlschlägt, wird eine Ausnahme erzeugt.

Verwenden Sie z. B. Int32.TryParse anstelle von Int32.Parse, um zu prüfen, ob ein Objekt eine gültige Ganzzahl ist. Denken Sie daran, dass Ausnahmen sehr teuer sind, wenn sie gecastet werden, und dass viele Casts die Leistung Ihrer Anwendung stark beeinträchtigen.

2 Stimmen

Zitat von Jon Skeet: "Wenn Sie jemals an den Punkt kommen, an dem Ausnahmen Ihre Leistung erheblich beeinträchtigen, haben Sie Probleme in Bezug auf Ihre Verwendung von Ausnahmen, die über die reine Leistung hinausgehen." yoda.arachsys.com/csharp/exceptions2.html

0voto

Will Rogers Punkte 357

Leere Catch-Blöcke sind ein sehr stinkender Code-Geruch. Kurz gesagt, Sie sollten sie nicht in Kurzform schreiben.

Regel Nr. 1 lautet: "Fang es nicht, wenn du es nicht verkraften kannst. Regel Nr. 1a lautet: "Wenn du die Ausnahme nicht wirklich gehandhabt hast, wirf sie erneut".

Wenn Sie nur versuchen, einen Absturz der Anwendung zu verhindern, gibt es in den meisten Fällen geeignetere Mechanismen zu verwenden. .NET enthält UnhandledException-Ereignisse auf Anwendungs-, Dispatcher- und AppDomain-Ebene sowie Ereignisse, die Sie über unbehandelte Ausnahmen in Hintergrund-Threads benachrichtigen. Wenn Sie auf dieser Ebene den Zustand Ihrer Anwendung nicht überprüfen können, besteht Ihre beste Option darin, den Benutzer zu benachrichtigen, dass etwas Schlimmes passiert ist, und die Anwendung zu beenden.

0 Stimmen

Der Verzehr einer Ausnahme ist die Behandlung der Ausnahme. Sie möchten beispielsweise nicht, dass Ihr Logging-Framework Ausnahmen auslöst, die verhindern, dass Ihre Geschäftsfunktionen funktionieren. Im Grunde wollen Sie nicht, dass Ihre Hauptaufgabe scheitert, nur weil es ein Problem in einem optionalen, unwesentlichen Code gibt. Regel Nr. 1 sollte eigentlich lauten, keine Regeln aufzustellen, denn es kommt darauf an. Man muss immer verstehen, warum man etwas tut und welche Auswirkungen es hat. Außerdem: Inwiefern bringt Ihre Antwort Klarheit in die ursprüngliche Frage?

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