Рассмотрим этот метод (простите печальную попытку юмора Чака Норриса:)):
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;
}
}
В resharper, я получаю предупреждение на строке "throw e", в которой говорится: "Вероятно, реконструирование исключений". Но, очевидно, в этом случае это не намерение, так как e может быть завернуто в ChuckNorrisException, и если я просто использую "throw", это исключение с оболочкой не будет выбрано.
Я знаю, что могу подавить предупреждение resharper, но тогда он будет отключен для всех сценариев, если я не ошибаюсь. Я просто задавался вопросом, столкнулся ли кто-нибудь еще с этим. Единственным обходным решением, которое я нашел, является создание другой переменной исключения (например, e2) и ее бросок. Это может быть лучшее, что я могу сделать здесь. Кажется, что resharper мог обнаружить эту проблему, хотя и быть достаточно умным, чтобы знать, что если e изменено, тогда throw e в порядке.
Спасибо.
[EDIT] Извините, я забыл шаг. Перед броском мне нужно регистрировать исключение, поэтому я не могу просто сделать:
e = e is DivideByZeroException ? new ChuckNorrisException("Only Chuck Norris can divide by 0!", e) :
e;
throw e;
Мне нужно сделать:
e = e is DivideByZeroException ? new ChuckNorrisException("Only Chuck Norris can divide by 0!", e) :
e;
LogException(e);
throw e;