c# - 抛出与捕获的类型相同的 C# 异常?

标签 c# exception-handling

为什么(如果有的话)这是个坏主意?

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”。我知道我可以创建我自己的自定义异常类,但是当您已经有一个很好的特定异常时,它似乎并没有增加什么。

当然,我可能是错的。这可能是一件非常有用的事情……但有一点声音建议不要这样做。

-----编辑-----

为了辩论,考虑以下两个函数的效果(使用上面的代码):

这...太常见了:

  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);
     }
  }

最佳答案

所有异常都有一个数据属性,您可以向其添加其他数据。无需创建新的异常。只需捕获现有异常并添加您的信息,然后重新抛出异常即可。

这样你就可以吃到蛋糕了。 :)

http://msdn.microsoft.com/en-us/library/system.exception_members(v=VS.90).aspx

关于c# - 抛出与捕获的类型相同的 C# 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3863812/

相关文章:

java - 为什么我不能捕获抛出泛型的调用的已检查异常?

c# - 避免多次 try catch

c# - Azure Devops 无法运行 xUnit 测试

c# - 添加更多参数然后在查询中使用?

c# - IEnumerable<T>.Count 在哪些情况下进行了优化?

c# - 为所有对象创建一个委托(delegate),而不是为每个对象创建一个委托(delegate)

c# - HttpClient在某些情况下修改BaseAddress

c++ - "first-chance exception..."消息中的十六进制数字是什么意思?

c# - 处理线程中 catch block 内抛出的异常的最佳实践。 (。网)

java - Log4j SmtpAppender - 主题异常