Domanda

Ho un metodo BO che deve fare due operazioni per adempiere al suo contratto.

  1. inserisci un record nel db
  2. invia una notifica via email contenente i metadati per il record

Entrambi sono gestiti con chiamate a singoli metodi DAO responsabili del completamento dell'azione.

Non intrappolo le eccezioni nel mio DAO, le gestisco e le pubblico nella BO. La prima chiamata è al DAO da inserire e può generare una NullReferenceException o una delle eccezioni sql. Il metodo e-mail utilizza SmtpClient.Send che può generare una serie di eccezioni.

È possibile forzare il metodo figlio che chiama la funzionalità e-mail per restituire solo un tipo di eccezione, uno personalizzato, attraverso un attributo?

Per illustrare questo:

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
}

Posso racchiudere ogni chiamata del metodo figlio nel suo catch di prova e generare l'eccezione personalizzata che desidero, ma questo è solo un altro livello di catch di tentativo che viene intrappolato da un altro tentativo di catch in AddSupportTicket e quindi uno nell'interfaccia utente per reindirizzare a un errore intelligente, quindi non mi sembra grandioso.

Come devo gettare efficacemente l'eccezione personalizzata corretta?

È stato utile?

Soluzione

Sì, è molto possibile. Dai un'occhiata alla Enterprise Library blocco di gestione delle eccezioni . Un sacco di grandi cose su come sollevare, avvolgere, registrare le eccezioni da e tra i livelli e impostare i criteri in modo da poterlo gestire nella configurazione se lo si desidera. In combinazione con il blocco dell'applicazione di registrazione, è una combinazione potente.

Altri suggerimenti

Se usi WCF puoi specificare quale tipo di eccezione può essere generata da una determinata funzione, quindi nella tua interfaccia di servizio avresti qualcosa come

[OperationContract]
[FaultContract(typeof(MemberAlreadyExistsException))]
void MemberInsert(Member mu);

Non conosci un attributo ma potresti non farlo:

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

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

C # non fornisce funzionalità come la parola chiave getta di Java, se è a questo che ti riferisci. Puoi documentare il tipo di eccezioni che il tuo codice genera tramite gli standard di documentazione XML, ma non c'è modo di forzarlo contrattualmente.

La tua scommessa migliore è una documentazione adeguata e una gestione intelligente delle eccezioni a tutti i livelli della tua applicazione, per quanto sembri banale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top