2012-04-13 4 views
0

Ich habe eine Schleife, die mehrere Male ausgeführt wird und für Ausnahmen anfällig ist (es ist webbasiert). Ich möchte jedoch nichts direkt aus der Methode werfen, da ich möchte, dass es sich im Falle eines Fehlers bei der nächsten Iteration bewegt. Also habe ich einen Referenzparameter hinzugefügt, den der Aufrufer übergibt, und alle Ausnahmen werden dort eingefügt.Zum inneren Objekt

ich die Ausnahme als auch die Fehler URL an den Benutzer zurückwechseln wollen, so habe ich folgendes Objekt:

class KeywordException 
{ 
    Exception ex; 
    string faultURL; 
} 

Es dem Benutzer als ref List<KeywordException> exceptions

Ok zurückgegeben es ist alles gut so weit, und ich fange Ausnahmen wie so:

catch (ArgumentNullException ane) 
{ 
    exceptions.Add(new KeywordException(ane, URL)); 
    continue; 
} 

Es funktioniert und die Ausnahme an den Benutzer zurückgegeben wird, aber wie kann ich von dem anrufenden Code wissen, was die Ausnahme tatsächlich war? Alles, was ich bekomme, ist Exception, wenn es in diesem Fall tatsächlich eine ArgumentNullException ist.

+2

Warum erbt Ihre KeyWordException nicht von Exception? – MPelletier

Antwort

1

Das Problem ist, dass Ihre KeywordException Klasse die Ausnahme als Ausnahme speichert (was macht Sinn und ist wahrscheinlich richtig).

Warum möchten Sie die genaue Art der Ausnahme wissen? Soll dem Benutzer eine Nachricht angezeigt werden? In diesem Fall können Sie mit reflection den konkreten Typ der ex-Variablen ermitteln:

string exceptionType = keywordException.ex.GetType().Name; 
+0

Kann ich dies verwenden, um die vollständige Ausnahme zu erhalten? Etwas wie 'var exception = keywordException.ex.GetType();'? – TheGateKeeper

+1

Nein, das gibt Ihnen das Type-Objekt. Sie haben bereits die volle Ausnahme im ex vairable. Es wird nur als Ausnahme interpretiert und muss an den tatsächlichen Typ zurückgegeben werden. Siehe meinen Kommentar in der Antwort oben. Sie müssen Ihre eigene Klasse erstellen, die Sie an den Benutzer zurückgeben. Diese Klasse sollte das Ergebnis beschreiben, statt Exceptions zu übergeben und zu erwarten, dass der Benutzer weiß, was er damit machen soll. – Martyn

+0

Sie haben Recht, ich werde meine eigene Ausnahme erstellen. Es ist viel einfacher und wird für den Benutzer besser funktionieren. – TheGateKeeper

1

Sie können die Eigenschaft InnerException betrachten - sie existiert bei jeder Ausnahme.

Diese Information würde auch auf dem Stack-Trace der Ausnahme enthalten sein.

Einer der Konstruktoren von Exception dauert Exception - wenn Sie dies verwenden, wird InnerException auf die übergebene Ausnahme gesetzt.

+0

also Ausnahme ex = new SomeOtherException verursacht die innere Ausnahme von ex SomeOtherException? – TheGateKeeper

+0

@TheGateKeeper - Nur wenn Sie die eigentliche Ausnahme an den Konstruktor übergeben. – Oded

+1

@TheGateKeeper: Wird Ihre 'KeywordException' Klasse * tatsächlich von' Exception' abgeleitet? Wenn nicht, vermute ich, dass "InnerException" hier ein Ablenkungsmanöver ist. Wenn Sie dies tun, aktualisieren Sie Ihre Frage bitte mit einem genaueren Beispiel - und sagen Sie auch, was Sie mit den Ausnahmen zu tun versuchen. –

1

Auch wenn die Kompilierung- Art von KeywordException.ex nur Exception ist, wenn Sie es log finden Sie das reale Objekt sehen. Sie könnten Test für bestimmte Arten verwendet:

if (keywordException.ex is ArgumentNullException) 

aber ich bezweifle, dass Sie das tun wollen. Sie sollten in Ordnung sein, um die Ausnahme unbedingt zu protokollieren - oder sie dem Benutzer in der von Ihnen gewünschten Form anzuzeigen.

EDIT: Sie können GetType() auf die Ausnahme rufen auch seine Art zu bekommen, natürlich:

Type exceptionType = keywordException.ex.GetType(); 

... aber es ist noch nicht klar, warum Sie einige Ausnahmen anders zu anderen behandeln wollen.

EDIT: Wenn Sie die typspezifischen Informationen in Ausnahme verwenden müssen, sollten Sie so etwas wie verwenden:

WebException webException = keywordException.ex as WebException; 
if (webException != null) 
{ 
    // Use webException here 
} 
+0

Ich denke, ich werde das 'ist' dafür verwenden müssen, sehe ich keine andere Möglichkeit zu wissen, was die Ausnahme tatsächlich aus dem aufrufenden Code war. – TheGateKeeper

+0

@TheGateKeeper: Warum müssen Sie * wissen? Was versuchst du mit Ausnahme * zu machen? –

+0

Ich muss wissen, weil einige Ausnahmen spezifische Details haben, die ich verwenden muss. Ich würde in den meisten Fällen die generische 'Exception.Message' verwenden, aber im Fall von' WebException' muss ich den Wert von 'WebException.Status' kennen, um dem Benutzer den wirklichen Fehler anzuzeigen. – TheGateKeeper

Verwandte Themen