Pregunta

Tengo un método BO que debe hacer dos operaciones para cumplir su contrato.

  1. inserte un registro en la base de datos
  2. enviar una notificación por correo electrónico que contenga los metadatos para el registro

Ambos se manejan con llamadas a métodos DAO individuales responsables de completar la acción.

No capturo excepciones en mi DAO, las manejo y publico en el BO. La primera llamada es a la DAO para insertar, y puede lanzar una NullReferenceException o una de las excepciones de SQL. El método de correo electrónico utiliza SmtpClient.Send, que puede generar una gran cantidad de excepciones.

¿Es posible forzar el método secundario que llama a la funcionalidad de correo electrónico para devolver solo un tipo de excepción, una personalizada, a través de un atributo?

Para ilustrar esto:

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
}

Puedo envolver cada llamada de método hijo en su propia captura de prueba y lanzar la excepción personalizada que quiero, pero eso es solo otro nivel de captura de prueba que queda atrapado por otra captura de prueba en AddSupportTicket, y luego una en la interfaz de usuario para redirigir a un error inteligente, por lo que no me suena muy bien.

¿Cómo debo lanzar eficientemente la excepción personalizada correcta?

¿Fue útil?

Solución

Sí, es muy posible. Consulte el bloque de manejo de excepciones de Enterprise Library . Un montón de cosas geniales sobre el aumento, ajuste, registro de excepciones desde y entre capas, así como la configuración de políticas para que pueda manejarlo en la configuración si lo desea. Combinado con el bloque de aplicaciones de registro, es una combinación poderosa.

Otros consejos

Si está usando WCF, puede especificar qué tipo de excepción puede lanzarse desde una función determinada, por lo que en su interfaz de servicio tendría algo como

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

No sabe acerca de un atributo, pero podría no hacerlo simplemente:

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

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

C # no proporciona funcionalidad como la palabra clave throws de Java, si a eso te refieres. Puede documentar el tipo de excepciones que su código puede lanzar a través de los estándares de documentación XML, pero no hay forma de forzar esto por contrato.

Su mejor apuesta es la documentación adecuada y el manejo inteligente de excepciones en todos los niveles de su aplicación, tan simple como suena.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top