Frage

Ich habe eine BO-Methode, die zwei Operationen tun muß, seinen Vertrag zu erfüllen.

  1. fügen Sie einen Datensatz in die db
  2. Geben Sie eine E-Mail-Benachrichtigung enthält die Metadaten für den Datensatz senden

Sowohl bei Anrufen auf einzelne DAO Methoden behandelt werden, die für die Aktion abgeschlossen ist.

ich nicht Falle Ausnahmen in meiner DAO, ich handhaben und sie in der BO veröffentlichen. Der erste Anruf wird auf das DAO einzufügen, und eine Nullreferenceexception oder eine der SQL-Ausnahmen auslösen kann. Die E-Mail-Methode verwendet SmtpClient.Send, die eine ganze Reihe von Ausnahmen auslösen kann.

Ist es möglich, das Kind Methode zu erzwingen, dass die E-Mail-Funktionalität ruft nur eine Art von Ausnahme zurückzukehren, einen benutzerdefinierten ein, durch ein Attribut?

Um dies zu veranschaulichen:

public void AddSupportTicket(SupportTicketDTO ticket)
{
    try
    {
        supportTicketDAO.Insert(ticket);
        email.SendNotification(ticket);
    }
    catch (ExceptionA exc) { ... } // both of the methods can throw exceptions that
    catch (ExceptionB exc) { ... } // can overlap.  I just care about returning       
    catch (ExceptionC exc) { ... } // a custom EmailException or DataException
}

Ich kann jedes Kind Methodenaufruf in einem eigenen Versuch fangen wickeln und die benutzerdefinierte Ausnahme auslösen, ich will, aber das ist nur eine andere Ebene von Try-Catch, die von einem anderen Versuch fangen in AddSupportTicket gefangen wird, und dann eine in der Benutzeroberfläche umleiten zu ein intelligenter Fehler, so dass nicht gut klingen für mich.

Wie soll ich effizient die richtige benutzerdefinierte Ausnahme auslösen?

War es hilfreich?

Lösung

Ja, es ist sehr gut möglich. Check out Enterprise Library Ausnahmebehandlung Block . Viele tolle Sachen auf die Erhöhung, Verpackung, Protokollierung Ausnahmen von und zwischen den Schichten sowie die Einrichtung Richtlinien, so dass Sie es in der Konfiguration umgehen können, wenn Sie wollen. In Kombination mit dem Logging-Anwendungsblock, es ist eine leistungsstarke Kombination.

Andere Tipps

Wenn Sie Ihre WCF verwenden, können Sie angeben, welche Art von Ausnahme von einer gegebenen Funktion ausgelöst werden kann, so dass in Ihrem Service-Schnittstelle Sie so etwas wie

haben würden
[OperationContract]
[FaultContract(typeof(MemberAlreadyExistsException))]
void MemberInsert(Member mu);

Sie wissen nicht, über ein Attribut, aber man kann man nicht einfach tun:

try{
...
} catch(Exception ex) {

  throw new MyException("Some biz msg", ex);
}

C # bietet keine Funktionen wie Java throws Schlüsselwort, wenn das, was Sie sich beziehen. Sie können die möglichen Ausnahmen, dass der Code meine throw über die XML-Dokumentationsstandards dokumentieren, aber es gibt keine Möglichkeit, dies zu vertraglich zu erzwingen.

Ihre beste Wette ist eine ordnungsgemäße Dokumentation und intelligente Ausnahme auf allen Ebenen Ihrer Anwendung Handhabung, wie aalglatt wie das klingt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top