¿Alguien puede arrojar algo de luz sobre los pros y contras de lanzar excepciones personalizadas (que heredan de System.Exception), o la forma correcta de usarlas? Ya conozco cuándo y cuándo no lanzar la excepción, pero estoy buscando orientación sobre cómo crear mis propias excepciones personalizadas..NET Throwing Custom Exceptions
Respuesta
Todas estas son buenas publicaciones. Hasta ahora, estoy más de acuerdo con Brian Rasmussen: cree excepciones personalizadas cuando quiera manejar diferentes tipos de excepciones específicas.
Quizás un ejemplo ayude. Este es un ejemplo artificial, y puede o no ser útil en el código cotidiano. Supongamos que tiene una clase responsable de autenticar a un usuario. Esta clase, además de autenticar a un usuario, tiene un mecanismo de bloqueo para bloquear a un usuario después de varios intentos fallidos. En tal caso, puede diseñar como parte de las excepciones personalizadas de clase dos: AuthenticationFailedException
y UserLockedOutException
. Su método AuthenticateUser
simplemente volvería sin tirar si el usuario se autenticó con éxito, tira AuthenticationFailedException
si el usuario no autenticó, o tira UserLockedOutException
si el usuario estaba bloqueado.
Por ejemplo:
try
{
myAuthProvider.AuthenticateUser(username, password);
ShowAuthSuccessScreen();
}
catch(AuthenticationFailedException e)
{
LogError(e);
ShowAuthFailedScreen();
}
catch(UserLockedOutException e)
{
LogError(e);
ShowUserLockedOutScreen();
}
catch(Exception e)
{
LogError(e);
ShowGeneralErrorScreen();
}
De nuevo, un ejemplo artificial. Pero, con suerte, muestra cómo y por qué querría crear excepciones personalizadas. En este caso, el usuario de la clase AuthProvider
está manejando cada excepción personalizada de una manera diferente.Si el método AuthenticateUser
simplemente hubiera lanzado Exception
, no habría forma de diferenciar entre las diferentes razones por las cuales se produjo la excepción.
buena explicación, con ejemplos obtiene mi voto a favor. – andrewWinn
Las excepciones personalizadas le permiten proporcionar excepciones claras y significativas, lo que a su vez puede hacer que su biblioteca sea más útil, siempre que use las excepciones existentes siempre que sea apropiado.
Cree una excepción personalizada cada vez que necesite presentar una excepción que no se ajuste directamente al modelo de excepción del marco.
Utilice sus propias excepciones para marcar los errores que son específicos de su aplicación/dominio. La ventaja es que tus bloques catch pueden filtrar las excepciones correctas y actuar sobre eso. Use excepciones estándar específicas para todo lo demás.
Hace poco escribió una entrada de blog entero sobre este tema en particular:
- http://blogs.msdn.com/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx
El resumen básico, aunque es ...
sólo se debe crear una nueva excepción si espera que los desarrolladores tomen medidas correctivas para el problema o que inicien sesión para la depuración post mortem.
De hecho, hay una gran serie de artículos de MSDN sobre este tema:
Why create custom exceptions?
Para ventajas/desventajas de la utilización de excepciones ver How to throw a good exception
Factors to consider when using custom exceptions
Best practices for creating Custom Exceptions
Creating and Throwing Exceptions
- 1. C# Re-throwing Exceptions
- 2. Throw Exceptions with custom stack trace
- 3. iterador .NET para envolver throwing API
- 4. .NET MVC Custom Date Validator
- 5. .Net Custom Trace file name
- 6. Green Exceptions?
- 7. .NET MVC 3 Custom Decimal? Carpeta modelo
- 8. Throwing ArgumentNullException
- 9. Ruby Constructors and Exceptions
- 10. Haskell Extensible IO Exceptions?
- 11. Task.WaitAll y Exceptions
- 12. Ruby Exceptions - ¿Por qué "else"?
- 13. UnitTest ExpectedException with multiple Exceptions
- 14. FormsAuthentication.SignOut throwing NullReferenceException
- 15. HttpRequestBase.UserHostAddress throwing error
- 16. Paquete MVCScaffoliding throwing MethodInvocationException
- 17. finalizador C# throwing exception?
- 18. $ .post throwing "Invocación ilegal"
- 19. java.util.Sublist throwing StackOverFlowError
- 20. ¿Puedo acceder a My Custom .NET Class desde PowerShell?
- 21. Authlogic throwing errors en Heroku
- 22. java.util.Prefs throwing BackingStoreException - ¿Por qué?
- 23. java throwing exception sin alcanzarlo?
- 24. Queue ForEach loop throwing InvalidOperationException
- 25. hosting clr y catching threading exceptions
- 26. Custom 'ExportFactory'
- 27. Custom DatePicker
- 28. Custom Caret para WinForms TextBox
- 29. FormsAuthentication.SetAuthCookie throwing NullReferenceException en acción asíncrona
- 30. Ajax upload plugin throwing jQuery.handleError no encontrado
Dupe: http://stackoverflow.com/questions/417428/why-create-custom-exceptions –
Yo no llamaría esto una estafa, cerca, pero no del todo en mi libro, tal vez no fui lo suficientemente claro en mi pregunta. – andrewWinn
Esto es sin duda una mejor redacción que el duplicado vinculado. Voy a votar para reabrir si se cierra. – Randolpho