Considere este método (perdón por el triste intento de Chuck Norris humor :)):Excepción ReSharper volver a lanzar posiblemente destinado
public class ChuckNorrisException : Exception
{
public ChuckNorrisException()
{
}
public ChuckNorrisException(string message)
: base(message)
{
}
public ChuckNorrisException(string message, Exception cause)
: base(message, cause)
{
}
protected ChuckNorrisException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
}
static void ExceptionTest(double x)
{
try
{
double y = 10/x;
Console.WriteLine("quotient = " + y);
}
catch (Exception e)
{
e = e is DivideByZeroException ? new ChuckNorrisException("Only Chuck Norris can divide by 0!", e) :
e;
throw e;
}
}
En ReSharper, recibo una advertencia en la línea de "tirar e" diciendo "excepción posiblemente volver a lanzar destinado a". Pero, obviamente, en este caso esa no es la intención, ya que e podría incluirse en ChuckNorrisException, y si solo uso "throw", esa excepción no se lanzaría.
Sé que puedo suprimir la advertencia de reafilar, pero luego se apagará para todos los escenarios si no me equivoco. Solo me preguntaba si alguien más se había encontrado con esto. La única solución que he encontrado es hacer otra variable de excepción (e2, por ejemplo), y arrojar eso. Eso puede ser lo mejor que puedo hacer aquí. Sin embargo, parece que el reafilado podría detectar este problema y ser lo suficientemente inteligente como para saber que si se modifica e, entonces tirar e está bien.
Gracias.
[EDITAR] Lo siento, olvidé un paso. Antes de banda, tengo que registrar la excepción, así que no puedo acaba de hacer:
e = e is DivideByZeroException ? new ChuckNorrisException("Only Chuck Norris can divide by 0!", e) :
e;
throw e;
que tengo que hacer:
e = e is DivideByZeroException ? new ChuckNorrisException("Only Chuck Norris can divide by 0!", e) :
e;
LogException(e);
throw e;
¿Por qué tiene que registrar la excepción antes de lanzarla (incluso si está envuelta en otra excepción)? ¿Por qué la persona que llama no puede registrar la excepción, incluida la excepción interna? –
Considere si este fuera un método de servicio en un servicio REST, por ejemplo, y deseara registrar esa excepción en el archivo de registro del servidor. Entonces, la persona que llama (por ejemplo, el cliente web) * podría * registrar la excepción, pero sería mucho mejor tener acceso a esa información de excepción en el registro del servidor. – dcp
Una excepción presentada en el código .NET en el servidor no puede ser capturada por un cliente. La excepción debe quedar atrapada en algún lugar del servidor; de lo contrario, el servidor se bloqueará. –