Ich schreibe ein Add-In für eine andere Software über seine API. Die von der API zurückgegebenen Klassen können nur über die native Software und die API zugreifen. Also schreibe ich meine eigenen Stand-alone-POCO/DTO-Objekte, die den API-Klassen zugeordnet sind. Ich arbeite an einer Funktion, die in einer nativen Datei liest und eine Sammlung dieser POCO-Objekte zurückgibt, die ich anderswo gestohlen habe. Derzeit verwende ich JSON.NET, um diese Klassen zu JSON zu serialisieren, wenn das wichtig ist.Entwurfsmuster für das Einschließen von Fehlern mit Rückgabewerten
Zum Beispiel habe ich eine DTO ähnliche Objekte
public class MyPersonDTO
{
public string Name {get; set;}
public string Age {get; set;}
public string Address {get; set;}
}
..und ein Verfahren wie dieses könnte die native "Personen" in meine DTO zu lesen
public static class MyDocReader
{
public static IList<MyPersonDTO> GetPersons(NativeDocument doc)
{
//Code to read Persons from doc and return MyPersonDTOs
}
}
I Unit-Tests Setup mit einer Testdatei, aber ich laufe immer wieder auf unerwartete Probleme, wenn ich meinen Export für andere Dateien ausführe. Manchmal haben native Objekte unerwartete Werte, oder es werden in der API Fehler angezeigt, die Ausnahmen auslösen, wenn es keinen Grund dafür gibt.
Derzeit, wenn etwas "Ausnahme" passiert, protokolliere ich nur die Ausnahme und der Export schlägt fehl. Aber ich habe beschlossen, dass ich lieber exportieren möchte, was ich kann, und die Fehler irgendwo aufzeichnen.
Die einfachste Möglichkeit wäre, nur um sich einzuloggen und die Ausnahmen zu schlucken und zurück, was ich kann, aber dann gäbe es keine Möglichkeit für meine Berufung Code zu wissen, wenn es ein Problem gab.
Eine Option, die ich in Betracht ziehe, ist die Rückgabe eines Fehlerwörterbuchs als separaten Parameter. Der Schlüssel würde die Eigenschaft identifizieren, die nicht gelesen werden konnte, und der Wert würde die Details der Ausnahme/des Fehlers enthalten.
Alternativ habe ich auch erwogen, nur die Fehler im Rückgabeobjekt selbst zu speichern. Dies vergrößert die Größe meines Objekts, hat aber den zusätzlichen Vorteil, dass die Fehler direkt mit meinen Objekten gespeichert werden. Später, wenn jemandes Export einen Fehler erzeugt, muss ich mich nicht darum kümmern, die richtige Log-Datei auf ihrem Computer zu finden.
public class MyPersonDTO
{
public string Name {get; set;}
public string Age {get; set;}
public string Address {get; set;}
public IDictionary<string, string> Errors {get; set;}
}
Wie wird dies in der Regel behandelt? Gibt es eine andere Möglichkeit, die Fehler zusammen mit den Rückgabewerten zu melden, die ich nicht in Betracht ziehe?
Abhängig von der Implementierung hält Martin Fowler die letzte Option für die beste. Es gibt auch eine Ausnahme, bei der Sie eine Ausnahme auslösen, wenn etwas schief geht. – Fals
Haben Sie zufällig einen Link zu einem Blogpost oder einer Präsentation, wo Martin darüber spricht? –
Da geht der Link für den Beitrag: http://martinfowler.com/articles/replaceThrowWithNotification.html – Fals