¿Existen excepciones definidas en .NET Framework que no debería incluir en mi propio código, o que es una mala práctica? ¿Debo escribir el mío?En C#, ¿hay alguna excepción incorporada que no deba usar?
Respuesta
No debe arrojar ninguna excepción que sea generada automáticamente por el CLR debido a errores del usuario. Por ejemplo
- StackOverflowException
- NullReferenceException
- AccessViolationException
- etc ...
La razón es hacerlo crea confusión para las personas que llaman a su API. Los usuarios deberían ser capaces de distinguir entre las excepciones lanzadas activamente por una API y las excepciones que no se lanzan activamente (lanzadas por CLR).
La razón es que en la excepción lanzada activamente generalmente representa un estado conocido en una API. Si llamo a una API y arroja una ArgumentException, tengo una expectativa razonable de que el objeto dado se encuentra en buen estado. Reconoció una situación potencialmente mala y la consideró activamente. Por otro lado, si arroja una NullRefrenceException, eso es una indicación de que la API encontró un error desconocido y ahora está en un estado no confiable.
Otra razón menor es que estas excepciones se comportan de manera diferente cuando se lanzan por código de usuario en lugar de CLR. Por ejemplo, es posible atrapar una StackOverflowException si la lanza el código del usuario, pero no si la lanza el CLR.
EDITAR En respuesta al comentario de Michael
También no debe lanzar excepciones, ApplicationException o SystemException directamente. Estos tipos de excepciones son demasiado generales para proporcionar información significativa al código que llama a su API. Es cierto que puede poner un mensaje muy descriptivo en el parámetro del mensaje. Pero no es sencillo ni fácil de mantener detectar una excepción basada en un mensaje. Es mucho mejor detectarlo según el tipo.
regla de FxCop sobre este tema: http://msdn.microsoft.com/en-us/library/ms182338(VS.80).aspx
hay varios excepción definida por usted. Siempre intente utilizar estos Exceptions antes de rodar su propio
@downvoters: por favor explique sus votos bajos, o no tienen sentido – dfa
La mayoría de las clases de excepción en el marco no están pensadas para su reutilización ya que generalmente están diseñadas para señalar algún error específico del Marco. Al igual que los mentioned by @JaredPar, el marco los utiliza para indicar ciertos estados en el marco.
Hay literalmente decenas, tal vez cientos, excepciones en el marco, por lo que la OMI es más útil enumerar los que nos deben uso.En la parte superior de mi cabeza, estos son los que utilizo activamente:
- ArgumentException, ArgumentNullException y ArgumentOutOfRangeException
- InvalidOperationException
- NotSupportedException
- NotImplementedException
Para otras condiciones de error en el código de usuario , la mejor práctica es crear sus propias clases de excepción.
De acuerdo. Y, de hecho, no debe lanzar una excepción donde un método Framework lo lanzará en su lugar. ** Es decir. ** Si encapsula una Stack
En un momento, Microsoft le decía a los programadores que no heredasen directamente de Exception, sino que utilizaran ApplicationException como su clase base. Sin embargo, no estoy seguro si esa opinión sigue siendo válida ...
Y si ya existe una excepción predefinida que cubra su condición de error exacta (como "NullReferenceException", o "InvalidArgumentException" etc.) - por supuesto, tira esos en lugar de reinventarlos dentro de tu propio código.
Marc
Sí, cambió la postura sobre ApplicationException. Ahora se recomienda no derivar de esa clase: http://blogs.msdn.com/brada/archive/2004/03/25/96251.aspx – JaredPar
Entre .NET 2.0 y 3.0, creo. El consejo para derivar de ApplicationException en .NET 2.0 todavía existe en MSDN para 2.0 y versiones anteriores - http://msdn.microsoft.com/en-us/library/system.applicationexception(VS.80).aspx. Para 3.0 cambió - http://msdn.microsoft.com/en-us/library/system.applicationexception(VS.85).aspx – BlackWasp
La línea Design Guidelines for Exceptions contiene el asesoramiento principio (ver específicamente this página).
El libro "Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition" tiene más detalles y más discusión sobre este tema.
@Michael En realidad, hay una situación en la que se recomienda lanzar una NullReferenceException: si el primer parámetro (el parámetro "this") de un método de extensión es nulo. Debe hacer esto para que las variables nulas se comporten como se espera.
- 1. ¿Hay alguna función PHP nativa que arroje una Excepción incorporada?
- 2. std :: regex - ¿hay alguna lib que deba vincularse?
- 3. ¿Existe alguna razón por la que no deba usar NVARCHAR en el servidor Sql?
- 4. ¿Hay alguna parte de LINQ que deba evitar para SQL 2000?
- 5. ¿Hay alguna buena razón que no debería usar - (guión) en los nombres de campo en MySQL?
- 6. ¿Hay alguna clase de C++ que no se pueda usar en STL?
- 7. ¿Hay alguna excepción a la impresión?
- 8. ¿Hay alguna razón por la que deba trabajar desde una sucursal en Git si soy un desarrollador solitario?
- 9. ¿Los controladores de eventos en C# deberían generar alguna excepción?
- 10. ¿Hay alguna razón para usar propiedades privadas en C#?
- 11. ¿hay alguna forma de hacer que una entrada de campo de texto deba ser un correo electrónico? (en xcode)
- 12. ¿Hay una búsqueda binaria incorporada en Ruby?
- 13. ¿Hay alguna manera de usar orderby en un forloop C#?
- 14. ¿Hay alguna forma incorporada para obtener la longitud de un iterable en python?
- 15. ¿Hay alguna ventaja al usar bloques sobre funciones en Objective-C?
- 16. ¿Hay alguna forma de usar operadores implícitos C# de F #?
- 17. C#: ¿Hay alguna forma de usar expresiones como variable/parámetro?
- 18. ¿Oracle tiene alguna función hash incorporada?
- 19. ¿Hay alguna razón para usar esto->
- 20. ¿Hay alguna razón para no usar "esto" ("Self", "Me", ...)?
- 21. ¿Hay alguna razón para no usar AssertionHelper con NUnit?
- 22. ¿Hay alguna herramienta que admita matemáticas discretas?
- 23. ¿Por qué no hay forma de deshacer "usar" en C++?
- 24. ¿Hay alguna forma de utilizar pythonappend con la nueva función incorporada de SWIG?
- 25. ¿Hay alguna razón para no usar las propiedades 'protegidas'?
- 26. ¿Hay alguna función incorporada de SQL Server para convertir cadenas en camel case?
- 27. ¿Hay alguna alternativa a C?
- 28. ¿Hay alguna función de hash de cadena javascript incorporada en los navegadores más nuevos?
- 29. ¿Algo que deba saber antes de convertir un gran programa en C++ de VS2005 a VS2008?
- 30. ¿Hay alguna razón para NO usar clases de excepción definidas por .NET Framework en su propio código?
Acepto, a excepción de NullReferenceException ... a menos que se comporte de manera diferente, creo que es válido lanzar esto cuando alguien pasa nulo como un parámetro que no puede ser nulo. – Eddie
@Eddie debe usar ArgumentNullException en lugar de NullReferenceException. Y sí, tiene un comportamiento diferente. Tendrá un código HRESULT diferente. – JaredPar
Debería agregar "Excepción" a la lista. La única forma de atraparlo sería tragar _todas_ excepciones. – Michael