2012-08-17 14 views
7

Ich habe eine Anforderung, eine Ausnahme auszulösen, wenn ich auf einen bestimmten Fehler stoße und in diesem Fall ein Objekt zurückgebe.Fehler zurückgeben und Ausnahme auslösen

Deshalb möchte ich, so etwas tun:

if(error) 
return obj; 
throw new FaultException(string.Format("Error found with ID={0}", ID)) 

Dies wird nicht offensichtlich funktioniert, als Rückkehr wird die Ausnahme von geworfen verhindern.

Kann jemand vorschlagen, was der beste Weg ist, dies zu erreichen. Kann ich das Objekt in der Ausnahme irgendwie weitergeben?

Dank

+4

Warum möchten Sie ein Objekt im Ausnahmefall zurückgeben? –

+0

Können Sie bitte die Signatur der von Ihnen implementierten Methode anzeigen? –

Antwort

8

Normalerweise würden Sie Ihre eigene Ausnahmeklasse erstellen, die alle Ihre Daten enthalten würde. Aber ich sehe FaultException was impliziert WCF, und dafür gibt es bereits FaultException<T>.

6

Im Zusammenhang mit irgendeiner Methode, Ausnahme zu werfen und das Ergebnis der Rückkehr sind sich gegenseitig ausschließende Dinge.

Also, wenn Sie den Client-Code mit den zusätzlichen Informationen zur Verfügung stellen möchten, können Sie benutzerdefinierte Ausnahme (abgeleitet von Exception Klasse) mit benutzerdefinierten Eigenschaften implementieren.

[Serializable] 
public class MyException : Exception 
{ 
    public MyCustomObject CustomObject { get; private set; } 

    public MyException(MyCustomObject customObject) 
    { 
     CustomObject = customObject; 
    } 

    public MyException(string message, MyCustomObject customObject) 
     : base(message) 
    { 
     CustomObject = customObject; 
    } 

    public MyException(string message, Exception inner, MyCustomObject customObject) 
     : base(message, inner) 
    { 
     CustomObject = customObject; 
    } 

    protected MyException(
     SerializationInfo info, 
     StreamingContext context) 
     : base(info, context) 
    { 
     // TODO: Implement serializable stuff. 
    } 

    #region Overrides of Exception 

    public override void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     // TODO: Implement serializable stuff. 
     base.GetObjectData(info, context); 
    } 

    #endregion 
} 

Jetzt können Sie es werfen!

throw new MyException(obj); 
4

Sie haben Recht, dass Sie ein Objekt weder zurückgeben noch eine Ausnahme auslösen können. Wenn das Ihre Anforderung ist, würde ich vorschlagen, es zu überarbeiten.

Aber ich würde sagen, Sie sind auf dem richtigen Weg, kommen mit einer Ausnahme, die das return-Objekt enthält. Fangen Sie die Ausnahme ab und holen Sie sich den Wert "returned" zurück.

Edit: Ich fand eine sehr interessante Diskussion eine Weile zurück in Bezug auf throwing exception vs returning error code. Hör zu. Ich denke immer noch, dass es besser ist, mit dem einen oder anderen zu gehen.

0

Wenn Sie einen Kontext von der Erweiterung abrufen möchten, fügen Sie ihn in Exception.Data ein oder erstellen Sie eine eigene Ausnahmeklasse und fügen Sie ein Mitglied hinzu (dies funktioniert besser, wenn die Ausnahme serialisiert werden muss).

Es wäre jedoch wahrscheinlich vorzuziehen (aber nicht ohne Kontext), wenn Sie den Code überarbeitet und/oder die Anforderungen neu überdacht haben, so dass Sie dies überhaupt nicht tun mussten.

0

Sie könnten eine Ausnahme Eigenschaft hinzufügen wie auch immer geartete obj ist und das Rück obj mit einem zugeordneten Exception (wenn man geworfen wird) und dann überprüfen Sie das Vorhandensein der Ausnahme in dem anrufenden Code für diese Methode, oder wo immer Sie sind Rückgabe obj an.

Etwas unordentlich, aber kann zu dem von Ihnen beschriebenen Setup passen.

Verwandte Themen