почему (если вообще) это плохая идея?
class Program
{
static void Main(string[] args)
{
try
{
throw new NotImplementedException("Oh dear");
}
catch (Exception ex)
{
throw NewException("Whoops", ex);
}
}
// This function is the salient bit here
public static Exception NewException(String message, Exception innerException)
{
return Activator.CreateInstance(innerException.GetType(), message, innerException) as Exception;
}
}
Важным моментом здесь является то, что функция создает исключение того же типа, что и "innerException".
Я думаю ... "Ох ... произошло исключение. Я не могу обработать это здесь, но я могу добавить некоторую дополнительную информацию и перебросить. Может быть, другой обработчик,выше цепочка вызовов может справиться с этим. "
Речь может идти о какой-то ошибке SQL.Возможно, я не смогу обработать исключение в момент вызова, но, возможно, захочу добавить некоторую дополнительную «контекстную» информацию, например «Я звонил и передавал это».
Кажется, чтополезно передать обратно по цепочке вызовов исключение того типа, который был изначально создан, в отличие от «Exception» или «ApplicationException».Я знаю, что мог бы создавать свои собственные классы исключений, но, похоже, это ничего не добавляет, если у вас уже есть конкретное исключение.
Конечно, я могу ошибаться.Это может быть очень полезно, но небольшой голос подсказывает, что нет.
----- edit -----
Ради обсуждения рассмотримэффекты следующих двух функций (используя приведенный выше код):
Это ... видно слишком часто:
static int SalesTotal(int customerNumber)
{
try
{
throw new DivideByZeroException(); // something you didn't expect
}
catch (Exception ex)
{
throw new ApplicationException("Unable to calculate sales for customer " + customerNumber, ex);
}
}
против этого ...
static int SalesTotal(int customerNumber)
{
try
{
throw new DivideByZeroException(); // something you didn't expect
}
catch (Exception ex)
{
throw NewException("Unable to calculate sales for customer " + customerNumber, ex);
}
}