|
|
1
253
保存堆栈跟踪的方法是使用
Mike 也是正确的,假设异常允许您传递异常(建议这样做)。 Karl Seguin 有一个 great write up on exception handling 在他的 foundations of programming e-book 还有,这本书读得很好。 编辑:工作链接到 Foundations of Programming PDF。只需在文本中搜索“exception”。 |
|
|
2
93
如果使用初始异常引发新的异常,也将保留初始堆栈跟踪。
|
|
|
3
26
实际上,有些情况下
stacktrace将指示第54行引发了异常,尽管它是在第47行引发的。
在如上所述的情况下,有两个选项可以预设原始StackTrace: 调用exception.internalPreserveStackTrace 由于它是私有方法,因此必须使用反射调用它:
我有一个缺点,那就是依赖一个私有方法来保存stacktrace信息。它可以在.NET Framework的未来版本中更改。上面的代码示例和下面的建议解决方案是从 Fabrice MARGUERIE weblog . 调用exception.setObjectData 以下技术由 Anton Tykhyy 作为回答 In C#, how can I rethrow InnerException without losing stack trace 问题。
虽然它的优点是只依赖于公共方法,但它还依赖于以下异常构造函数(第三方开发的一些异常没有实现):
在我的情况下,我必须选择第一种方法,因为我使用的第三方库引发的异常没有实现这个构造函数。 |
|
|
4
19
当你
|
|
|
5
13
经验法则是避免抓住和扔掉
但在现实世界中
测井
基本异常也是一个很好的实践,但是不要忘记走整条路来获得任何
|
|
|
6
8
一些人实际上错过了一个非常重要的点——“throw”和“throw ex”可能会做同样的事情,但他们没有给你一个关键的信息,这就是发生异常的那条线。 请考虑以下代码:
当您执行“throw”或“throw ex”操作时,您会得到堆栈跟踪,但第行将是22,因此您无法确定到底是哪一行引发了异常(除非您在try块中只有一行或几行代码)。要获得异常中预期的第17行,您必须使用原始异常堆栈跟踪抛出一个新的异常。 |
|
|
7
8
应始终使用“throw;”重新引发.NET中的异常, 请参考这一点, http://weblogs.asp.net/bhouse/archive/2004/11/30/272297.aspx 基本上,msil(cil)有两条指令——“throw”和“rethrow”:
基本上,我可以看到为什么“throw-ex”会覆盖堆栈跟踪。 |
|
|
8
8
没有人能解释
重新引发捕获的异常的完整方法是使用
下面是测试这一点的必要案例: 1。
2。
三。
4。
案例1和案例2将为您提供一个堆栈跟踪,其中
但是,案例3将为您提供一个堆栈跟踪,其中
案例4与案例2类似,因为保留了原始异常的行号,但由于它更改了原始异常的类型,因此不是真正的重新引发。 |
|
|
9
3
您还可以使用:
任何抛出的异常都将冒泡到处理它们的下一个级别。 |
|
|
10
3
我肯定会用:
这将保留您的堆栈。 |
|
|
11
0
仅供参考,我刚刚测试了这个,并且'throw;'报告的堆栈跟踪不是完全正确的堆栈跟踪。例子:
堆栈跟踪正确地指向异常的起源(报告的行号),但为foo()报告的行号是throw;语句的行,因此您无法判断对bar()的调用中哪一个导致了异常。 |