首页 > 后端开发 > C++ > ` throw` 与 ` throw new Exception()`:什么时候应该在 C# 中重新抛出异常?

` throw` 与 ` throw new Exception()`:什么时候应该在 C# 中重新抛出异常?

Susan Sarandon
发布: 2025-01-13 12:20:53
原创
346 人浏览过

`throw` vs. `throw new Exception()`: When Should You Rethrow Exceptions in C#?

C#异常处理:throwthrow new Exception() 的区别

在处理C#异常时,程序员可能会遇到两种看起来相似的结构:

<code class="language-csharp">try { ... }
catch { throw }</code>
登录后复制

以及

<code class="language-csharp">try { ... }
catch (Exception e) { throw new Exception(e.Message); }</code>
登录后复制

虽然两者都会抛出异常,但它们的行为存在关键差异。

throw

不带参数的throw语句会重新抛出导致try块失败的原始异常。这意味着原始异常的堆栈跟踪被保留,方便调试和追溯错误的来源。

throw new Exception()

另一方面,throw new Exception(e.Message) 会创建一个新的异常实例,其Message属性设置为原始异常的消息。但是,这有几个缺点:

  • 堆栈跟踪丢失: 新异常的堆栈跟踪被重置,破坏了原始异常来源的任何跟踪信息。
  • 类型信息丢失: 新异常丢失了原始异常的类型,使得难以确定其确切性质。
  • 附加信息丢失: 一些异常,例如ArgumentException,包含附加信息(如ParamName),在创建不同类型的新异常时会丢失这些信息。

最佳实践:

在大多数情况下,强烈建议避免使用throw ethrow new Exception(e.Message)来重新抛出异常。请考虑以下方法:

  • 保留原始堆栈跟踪: 要重新抛出原始异常并保留其堆栈跟踪,请使用throw;
  • 包装异常: 在某些情况下,可能需要将所有异常包装在自定义异常对象中以提供其他信息。但是,始终确保自定义异常具有所有四个异常构造函数,并通过将其作为InnerException参数传递来保留原始异常的属性,包括堆栈跟踪。

以上是` throw` 与 ` throw new Exception()`:什么时候应该在 C# 中重新抛出异常?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板