Pergunta

Eu tenho um método BO que deve fazer duas operações para cumprir seu contrato.

  1. inserir um registro no db
  2. enviar uma notificação por e-mail contendo os metadados para o registro

Ambos são tratados com chamadas para métodos DAO individuais responsáveis ??pela realização da acção.

Eu não exceções armadilha no meu DAO, eu segurar e publicá-los no BO. A primeira chamada é para o DAO para inserção, e pode lançar um NullReferenceException ou uma das exceções SQL. O método de e-mail usa SmtpClient.Send que pode lançar uma série de exceções.

É possível forçar o método criança que chama a funcionalidade de e-mail para retornar apenas um tipo de exceção, um costume, por meio de um atributo?

Para ilustrar isso:

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
}

Eu posso envolver cada chamada de método criança em sua própria try catch e lançar a exceção personalizada que quero, mas isso é apenas um outro nível de try catch que fica preso por um outro try catch em AddSupportTicket, e, em seguida, um na UI para redirecionar para um erro inteligente, de modo que não soa bem para mim.

Como devo eficiente lançar a exceção personalizado correto?

Foi útil?

Solução

Sim, é muito possível. Confira Enterprise Library exceção bloco de tratamento de . Muita coisa bacana sobre o levantamento, o acondicionamento, registrando exceções entre e para as camadas, bem como a criação de políticas para que você possa segurá-lo na configuração se você quiser. Combinado com o bloco de aplicativo de registro, é uma combinação poderosa.

Outras dicas

Se o seu usando WCF você pode especificar que tipo de exceção pode ser lançada a partir de uma determinada função, por isso, o seu serviço de interface que você teria algo como

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

Não sei sobre um atributo, mas você pode não apenas fazer:

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

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

C # não fornece funcionalidade como palavra-chave throws de Java, se é isso que você está se referindo. Você pode documentar os tipos de exceções que o seu código meu lance através dos padrões de documentação XML, mas não há nenhuma maneira de contratualmente forçar isso.

Sua melhor aposta é a documentação adequada e tratamento de exceção inteligente em todos os níveis de sua aplicação, como glib como isso soa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top