首页 / 知识
关于C#:捕获和重新抛出.NET异常的最佳实践
2023-04-12 21:52:00

Best practices for catching and re-throwing .NET exceptions捕获异常并重新抛出异常时,应考虑哪些最佳实践?我要确保保留
Vs:
保存堆栈跟踪的方法是使用
Mike也是正确的,假设异常允许您传递异常(建议这样做)。 卡尔·塞古在他编写电子书的基础上也写了一篇关于异常处理的伟大文章,这是一本伟大的著作。 编辑:指向编程PDF基础的工作链接。只需在文本中搜索"exception"。 如果使用初始异常引发新的异常,也将保留初始堆栈跟踪。
实际上,在某些情况下,
stacktrace将指示第54行引发了异常,尽管它是在第47行引发的。
在如上所述的情况下,有两个选项可以预设原始StackTrace: 调用exception.internalPreserveStackTrace 由于它是私有方法,因此必须使用反射调用它:
我有一个缺点,那就是依赖一个私有方法来保存stacktrace信息。它可以在.NET Framework的未来版本中更改。上面的代码示例和下面的解决方案是从FabriceMarguerie的日志中提取的。 调用exception.setObjectData 下面的技术是由Anton Tykhyy提出的,作为C中的答案,我如何在不丢失堆栈跟踪问题的情况下重新发送InnerException。
虽然它的优点是只依赖于公共方法,但它还依赖于以下异常构造函数(第三方开发的一些异常没有实现):
在我的情况下,我必须选择第一种方法,因为我使用的第三方库引发的异常没有实现这个构造函数。 当您 经验法则是避免捕捉和投掷基本的 但在现实世界中,捕获和记录基本异常也是一个好的实践,但不要忘记走完整的路去获取它可能拥有的任何 没有人解释过 重新引发捕获的异常的完整方法是使用 下面是测试这一点的必要案例: 1。
2。
三。
4。
案例1和案例2将给出一个堆栈跟踪,其中 但是,案例3将给出一个堆栈跟踪,其中 案例4与案例2类似,因为保留了原始异常的行号,但由于它更改了原始异常的类型,因此不是真正的重新引发。 一些人实际上错过了一个非常重要的点——"throw"和"throw ex"可能会做同样的事情,但他们没有给你一个关键的信息,这就是发生异常的那条线。 请考虑以下代码:
当您执行"throw"或"throw ex"操作时,您会得到堆栈跟踪,但第行将是22,因此您无法确定到底是哪一行引发了异常(除非您在try块中只有一行或几行代码)。要获得异常中预期的第17行,您必须使用原始异常堆栈跟踪抛出一个新的异常。 应始终使用"throw;"重新引发.NET中的异常, 请参考这一点,http://weblogs.asp.net/bhouse/archive/2004/11/30/272297.aspx 基本上,msil(cil)有两条指令——"throw"和"rethrow":
基本上,我可以看到为什么"throw-ex"会覆盖堆栈跟踪。 您还可以使用:
任何抛出的异常都将冒泡到处理它们的下一个级别。 我肯定会用:
这将保留您的堆栈。 仅供参考,我刚刚测试了这个,并且'throw;'报告的堆栈跟踪不是完全正确的堆栈跟踪。例子:
堆栈跟踪正确地指向异常的起源(报告的行号),但为foo()报告的行号是throw;语句的行,因此您无法判断对bar()的调用中哪一个导致了异常。 |
最新内容
相关内容
Python如何创建对象,有哪些方法
Python如何创建对象,有哪些方法,培训,对象,方法,内容,函数,属性,所在,以上,以下,功能,以下介绍Python创建对象的9种方法。classPoint:def__inipython类对象和实例对象是一样的吗
python类对象和实例对象是一样的吗,地址,概念,下来,数据,培训,实例,对象,方法,属性,变量,python面向对象最重要的概念就是类(Class)和实例(Inpython出错时怎么抛出异常
python出错时怎么抛出异常,异常,代码,信息,基础,检测,培训,语句,发生,程序,结束,基础异常处理try/except语句用来检测try语句块中的错误,从而python对象与方法的区别是什么
python对象与方法的区别是什么,地址,数据,培训,对象,函数,类型,字符串,方法,表示,身份,python使用对象模型来存储数据,也就是说构造任何类型的python如何实例化一个对象
python如何实例化一个对象,培训,名称,实例,括号,关键字,对象,函数,字母,方式,以上,python中同样使用关键字class创建一个类,类名称第一个字母python类和对象的区别是什么
python类和对象的区别是什么,培训,主体,汽车,状态,对象,定义,属性,方法,实例,区别,类和对象1、类和对象得区别:类是对客观世界中事物得抽象,而python怎么抛出异常信息
python怎么抛出异常信息,异常,代码,信息,基础,检测,培训,语句,发生,程序,除数,当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行python不抛出异常怎么办
python不抛出异常怎么办,异常,信息,培训,检测,基础,语句,发生,程序,除数,错误,异常是Python对象,表示一个错误。当Python脚本发生异常时我们需python如何判断对象的某个属性
python如何判断对象的某个属性,培训,异常,名称,方法,对象,属性,特性,参数,逻辑,以上,在python判断某个对象是否具有某属性可以使用以下方法方python如何实例化对象
python如何实例化对象,培训,名称,实例,括号,关键字,对象,函数,字母,方式,以上,python中同样使用关键字class创建一个类,类名称第一个字母大写,python判断对象是否有某个属性
python判断对象是否有某个属性,培训,名称,异常,属性,对象,方法,参数,定义,以上,更多,python判断对象是否有某个属性的方法:hasattr(object,nampython如何确定是否为可迭代对象
python如何确定是否为可迭代对象,培训,元素,索引,对象,整数,字典,函数,类型,下标,模块,迭代可以理解为,任意的集合使用for循环遍历python中,迭