2008-12-03 7 views
35

Implemento tradicionalmente un conjunto de páginas web que permiten la validación manual de la funcionalidad de la aplicación principal. Un ejemplo es LoggerTest.aspx que genera y registra una excepción de prueba. Siempre he elegido para criar a un DivideByZeroException usando un enfoque similar al siguiente fragmento de código:¿Cuál es la mejor manera de presentar una excepción en C#?

try 
{ 
    int zero = 0; 
    int result = 100/zero; 
} 
catch (DivideByZeroException ex) 
{ 
    LogHelper.Error("TEST EXCEPTION", ex); 
} 

El código funciona muy bien, pero siento que tiene que haber una solución más elegante. ¿Hay una mejor manera de plantear una excepción en C#?

+0

Gracias por los comentarios. He marcado la respuesta de GalacticCowboy como correcta, ya que obviamente es la respuesta correcta basada en la forma en que se formula la pregunta. Gracias de nuevo por los comentarios y lo siento si la pregunta fue vaga. –

+0

Para aquellos que piensan "tiene que haber más para esta pregunta", tienes razón. En esencia, estaba buscando la mejor manera de plantear/causar/simular una excepción. Como dijo James Curran, es la ocurrencia de la excepción en lugar de lanzar una excepción que estoy buscando. Forzar una DivideByZeroException es mi estrategia predeterminada, aunque pensé que podría haber otra forma o incluso una mejor excepción a la fuerza. Es muy probable que no haya diferencia entre tirar y "levantar" una excepción. La mayoría de las respuestas parecen ser al menos de esta opinión. –

Respuesta

64
try 
{ 
    throw new DivideByZeroException(); 
} 
catch (DivideByZeroException ex) 
{ 
    LogHelper.Error("TEST EXCEPTION", ex); 
} 
+2

Esto es algo peligroso. El CLR se comportará de manera diferente cuando un usuario plantea de forma explícita una excepción que normalmente plantea el CLR. Consulte esta publicación para obtener más detalles: http://blogs.msdn.com/jaredpar/archive/2008/10/22/when-can-you-catch-a-stackoverflowexception.aspx – JaredPar

+0

Sin embargo, una excepción de división por cero es intrínsecamente comprobable y arrojable sin * en realidad * tratando de realizar la división. Un desbordamiento de pila es una bestia diferente, y está documentado como tal. Otras excepciones también señalan las anotaciones de tipo "no destinado a ser lanzado por el código de cliente". – GalacticCowboy

+0

Eso es solo para StackOverfloWExceptions. Esto se debe a que muchas veces, la cláusula de captura aún sería profunda en la pila y desbordaría la pila misma. Esa excepción nunca puede ser capturada o manejada cuando es lanzada por el CLR. – configurator

23

Respuesta corta:

throw new Exception("Test Exception"); 

Usted necesitará

using System; 
+0

No debe usar Exception en sí mismo, debe usar una implementación existente o crear la suya propia. La excepción es demasiado genérica. Brad Abrams (del equipo de diseño de .NET framework) afirma que desea poder volver a hacer esa clase con un constructor privado para evitar su uso así –

+0

Esto es bueno para probar un nuevo registro de auditoría. Muy básico que se romperá. trabajado para mí, gracias. – JoshYates1980

+0

Inicia sesión para votar por esto. Aún no veo una buena razón para NO hacerlo de esta manera, especialmente para probar registradores. – VSO

3

exceptionhere tiro;

¿No es así?

Ejemplo que encontré fue

 if (args.Length == 0) 
     { 
      throw new ArgumentException("A start-up parameter is required."); 
     } 
1

throw new DivideByZeroException("some message");?

¿O me está faltando algo?

0

Para propósitos de prueba es probable que desee crear una clase específica (tal vez TestFailedException?), Y echarlo en lugar de secuestro de otro tipo de excepción.

1

Si solo está probando el método Error de LogHelper, ¿por qué lanzar la excepción? Solo necesita un trazador de líneas:

LogHelper.Error("TEST EXCEPTION", new Exception("This is a test exception")); 
+0

+1, aunque la pregunta fue un poco más general: ¿cuál es el método preferido para presentar una excepción? – GalacticCowboy

3

Así que, permítame ponerme en forma para seguir haciéndolo como era. No desea probar qué ocurre cuando se lanza un DivideByZeroException; quieres probar lo que sucede cuando ocurre una división por cero.

Si no ve la diferencia, considere: ¿Está realmente seguro de cuándo quiere comprobar NullRefernceException y cuándo para ArgumentNullException?

2

Gracias por los comentarios. He marcado la respuesta de GalacticCowboy como correcta, ya que obviamente es la respuesta correcta basada en la forma en que se formula la pregunta.

Para aquellos que piensan "tiene que haber más para esta pregunta", tienes razón. En esencia, estaba buscando la mejor manera de plantear/causar/simular una excepción. Como dijo James Curran, es la ocurrencia de la excepción en lugar de lanzar una excepción que estoy buscando. Forzar una DivideByZeroException es mi estrategia predeterminada, aunque pensé que podría haber otra forma o incluso una mejor excepción a la fuerza.

Es muy probable que no haya diferencia entre lanzar y "levantar" una excepción. La mayoría de las respuestas parecen ser al menos de esta opinión.

Gracias de nuevo por los comentarios y lo siento si la pregunta era vaga.

5

¿Cree una excepción personalizada para fines de prueba? Luego, puede agregar las propiedades personalizadas que desee que lleve la excepción en su camino a través del proceso de manejo/registro de excepciones ...

[Serializable] 
public class TestException: ApplicationException 
{ 
    public TestException(string Message, 
        Exception innerException): base(Message,innerException) {} 
    public TestException(string Message) : base(Message) {} 
    public TestException() {} 

    #region Serializeable Code 
    public TestException(SerializationInfo info, 
      StreamingContext context): base(info, context) { } 
    #endregion Serializeable Code 
} 

en su clase

try 
{ 
     throw new TestException(); 
} 
catch(TestException eX) 
{ 
    LogHelper.Error("TEST EXCEPTION", eX); 
} 
1
 try 
     { 
      string a="asd"; 
      int s = Convert.ToInt32(a); 
     } 
     catch (Exception ex) 
     { 

      Response.Write(ex.Message); 
     } 

Volverá excepción "Cadena de entrada no estaba en un formato correcto."

Cuestiones relacionadas