2009-06-30 1 views
5

Ich suche nach einer "eleganten" Möglichkeit, Ausnahmen beim Aufruf einer Methode zu unterdrücken.Wie unterdrücken Sie Fehler bei einem Methodenaufruf in C#?

Ich denke, der folgende Code Art und Weise zu ausführlich ist:

try 
{ CallToMethodThatMayFail(3); } 
catch {} 

Gibt es einen syntaktischen Zucker ich sagen können: „Ich weiß nicht wirklich, wenn diese Methode nicht“? Ich möchte die Methode aufrufen und die Ausführung fortsetzen, unabhängig davon, was mit der Methode geschieht.

+3

Klingt wie Sie wollen böse VB wie On Error Resume Next Funktionalität in C#! – RichardOD

+0

Ich denke, das ist wahrscheinlich so elegant, wie Sie bekommen können. Das Übergeben einer Funktion zum Behandeln des Fehlers würde wahrscheinlich verwirrender sein. Ich würde nicht auf Fehlerbehandlung verlassen, um Fehler zu ignorieren. Ich würde empfehlen, für Ihre erwarteten Fehlerfälle zu testen, die Sie ignorieren möchten und nur in Ihrem Code behandeln. Das Auslösen einer Ausnahme ist in Bezug auf die Leistung teurer als eine bedingte Anweisung. –

+0

Ich möchte auf alle Nischenszenarien hinweisen, wenn das eine gute Idee ist. Wie heute musste ich Code modifizieren, der ein dynamisch erzeugtes Datagrid liest, das einfach Spalten erstellt, die auf Zeilennamen von einer SQL VIEW basieren. Gelegentlich wird die VIEW geändert und dies funktioniert gut im Code, diese Ansicht kann auch wo sonst verwendet werden. Für diese eine Webseite benötigte ich die Spalten, die auf eine bestimmte Art benannt wurden, aber ich möchte nicht, dass der Code bricht, wenn jemand die Ansicht in der Zukunft ändert. – TravisO

Antwort

10

Es ist selten eine gute Idee zu ignorieren/Fehler schlucken ...

Um so etwas wie ein Verfahren der Wiederverwendung, die einzige Option, die Sie haben, ist erlaubt, die ein Action nehmen:

static void IgnoreErrors(Action action) {try {action();} catch {}} 
aber Sie haben nicht gerade viel gerettet durch die Zeit, die Sie getan haben:

SomeHelper.IgnoreErrors(() => CallToMethodThatMayFail(3)); 

ich hatte gerade die anstelle try/catch verlassen ...


Zur Frage im Kommentar:

static void IgnoreErrors<T>(Action action) where T : Exception 
{ 
    try { action(); } catch (T) {} 
} 

SomeHelper.IgnoreErrors<ParseException>(() => CallToMethodThatMayFail(3)); 

aber ich würde es noch klarer finden die lokal try/catch haben ...

+0

Gibt es eine Möglichkeit, dass Sie eine "IgnoreError" -Funktion haben, die sowohl die Funktion zum Aufrufen als auch den zu ignorierenden Fehlertyp akzeptiert? Auf diese Weise würden Sie Systemfehler nicht ignorieren, aber Sie könnten "Parse-Fehler" ignorieren, wenn Sie durch viele von Benutzern eingegebene Daten iterieren. – DevinB

+0

ja ... Ich werde aktualisieren –

+0

@Marc: Du hast Recht; es ist selten eine gute Idee, dies zu tun. Aber für den Fall, dass Sie es tun möchten, was ist der beste Weg, es zu tun? Ich weiß es zu schätzen, dass Sie die Fragen beantwortet haben. Ich bin nicht so dankbar für Nicht-Antworten, die Upvotes bekommen. –

1

Ich weiß nichts Genaueres. Ich nehme an, du könntest etwas AOP oder ähnliches für etwas ausgefalleneres tun.

+0

Ja, etwas AOPish ist, was ich auch dachte. Ich weiß einfach nicht, wie ich das machen soll. –

+0

Etwas AOPish ... http://www.postsharp.org/ –

+1

(-1) "Ich weiß nicht" hilft nicht wirklich. "Angenommen, Sie könnten tun" ist nicht wirklich eine Antwort. – DevinB

5

Nö, das ist es.

Und es ist eine gute Sache, es ist ausführlich. Wenn Sie eine mögliche Ausnahme unterdrücken, haben Sie einen guten Grund. Die Ausführlichkeit hilft Ihnen oder der nächsten Person, die sich den Code in ein paar Monaten ansieht.

+1

Bei allem Respekt: ​​Ich kann die Entscheidung treffen, ob ich einen guten Grund habe, die Ausnahme zu unterdrücken. Sie gehen auch davon aus, dass es sich um Code handelt, den sich tatsächlich jemand anders ansieht. –

0

Nein, es gibt keinen besseren Weg dies zu tun, und es gibt einen guten Grund dafür. Die angezeigte Ausnahme kann mehr bedeuten als "die Methode ist fehlgeschlagen". Es kann bedeuten, "das System versagt".

Sie sollten zumindest die Tatsache des Fehlers protokollieren, falls es sich schließlich als wichtig herausstellen sollte.

4

Schloss verwenden, können Sie etwas tun:

public class ExceptionSuppressionInterceptor : Castle.Core.Interceptor.IInterceptor 
{ 
    public void Intercept(IInvocation invocation) 
    { 
     try { 
      invocation.Proceed(); 
     } 
     catch (Exception ex) { 
      // Suppressed! 
     } 
    } 
} 

und schmücken die Klasse, die Sie für wie diese Ausnahmen zu unterdrücken wollen:

[Interceptor(typeof(ExceptionSuppressionInterceptor))] 
public class GoodPracticeBreaker { 

} 

Aber Sie wirklich wahrscheinlich nicht sollte.

+0

Guter Übungsbrecher! :) – Groo

0

Warum sagen Sie das ist zu ausführlich? Wenn Sie versuchen, Tastenanschläge zu speichern, können Sie einfach ein Code-Snippet verwenden. Wenn Sie sich Sorgen um die Lesbarkeit machen, dann denke ich, dass eine AOP-Methode für einen anderen Betreuer (zumindest anfänglich) weniger klar ist und für mich die Ausführlichkeit überwiegt.

1

Die .Net-Konvention ist, dass Klassen eine TryCallMayFail() - Methode und eine CallMayFail() -Methode implementieren und der Aufrufer wählt, welche zu verwenden, aber die TryCallMayFail() -Methode würde genau das, was Sie dort haben.

+0

Alle Klassen? Alle Methoden? –

+0

Nicht alle, außer ein paar von ihnen, und es ist ein Stil, an den ich mich gewöhnt habe – SpaceghostAli