捕获和重新抛出.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"覆盖堆栈跟踪的原因。