捕获和重新抛出.NET异常的最佳实践

时间:2020-03-05 18:42:04  来源:igfitidea点击:

捕获异常并重新抛出异常时应考虑哪些最佳实践?我要确保保留"异常"对象的" InnerException"和堆栈跟踪。以下代码块之间的处理方式是否有所不同?

try
{
    //some code
}
catch (Exception ex)
{
    throw ex;
}

VS:

try
{
    //some code
}
catch
{
    throw;
}

解决方案

回答

保留堆栈跟踪的方法是通过使用throw;

try {
  // something that bombs here
} catch (Exception ex)
{
    throw;
}

从这一点来看,throw ex;基本上就像抛出一个异常,因此堆栈跟踪只会到达我们发出throw ex;语句的位置。

迈克(Mike)也是正确的,假设该异常允许我们传递异常(建议)。

Karl Seguin在编程电子书的基础上也对异常处理进行了出色的撰写,这是一本不错的书。

编辑:工作链接到编程基础pdf。只需在文本中搜索" exception"即可。

回答

当我们抛出ex时,实际上是在抛出新的异常,并且会错过原始堆栈跟踪信息。 throw是首选方法。

回答

经验法则是避免捕获和抛出基本的" Exception"对象。这迫使我们对异常情况要更加聪明。换句话说,我们应该有一个SqlException的显式捕获,这样处理代码就不会对NullReferenceException做出任何错误的处理。

虽然在现实世界中,捕获和记录基本异常也是一种好习惯,但是不要忘了走遍整个过程,以获取可能具有的所有" InnerExceptions"。

回答

如果我们使用初始异常抛出新的异常,则我们还将保留初始堆栈跟踪。

try{
} 
catch(Exception ex){
     throw new MoreDescriptiveException("here is what was happening", ex);
}

回答

我肯定会使用:

try
{
    //some code
}
catch
{
    //you should totally do something here, but feel free to rethrow
    //if you need to send the exception up the stack.
    throw;
}

那将保留堆栈。

回答

我们还可以使用:

try
{
// Dangerous code
}
finally
{
// clean up, or do nothing
}

并且抛出的任何异常都将上升到处理它们的下一个层次。

回答

我们应该始终使用"投掷";重新抛出.NET中的异常,

引用这个
http://weblogs.asp.net/bhouse/archive/2004/11/30/272297.aspx

MSIL(CIL)基本上有两条指令" throw"和" rethrow":

  • C#的" throw ex;"被编译成MSIL的"抛出"
  • C#的"抛出;" -进入MSIL"重新抛出"!

基本上,我可以看到" throw ex"覆盖堆栈跟踪的原因。