2009-04-18 21 views

Respuesta

22

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

+0

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

+10

@Eddie debe usar ArgumentNullException en lugar de NullReferenceException. Y sí, tiene un comportamiento diferente. Tendrá un código HRESULT diferente. – JaredPar

+5

Debería agregar "Excepción" a la lista. La única forma de atraparlo sería tragar _todas_ excepciones. – Michael

0

hay varios excepción definida por usted. Siempre intente utilizar estos Exceptions antes de rodar su propio

+0

@downvoters: por favor explique sus votos bajos, o no tienen sentido – dfa

9

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:

Para otras condiciones de error en el código de usuario , la mejor práctica es crear sus propias clases de excepción.

+0

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 una clase de supervisor y tiene un método que invoca 'stack.Pop()', simplemente deje que el objeto 'System.Collections.Generic.Stack ' lance 'InvalidOperationException'. No lo arrojes tú mismo después de verificar por> 0 elementos. –

2

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

+2

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

+1

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

3

@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.

Cuestiones relacionadas