【问题标题】:Distinguish between exception of same type区分相同类型的异常
【发布时间】:2016-03-20 18:31:21
【问题描述】:

区分两个相同类型但因不同原因引发的异常的最佳方法是什么。

例如,InvalidOperationException 可以在尝试访问空序列时抛出,但也可以在使用 Concurrent 对象时抛出(例如 BlockingCollection

根据我的阅读,我得出的结论是,使用BlockingCollection.CompleteAdding() 表示完成非常好,因此需要捕获异常并适当处理(例如退出任务)

在不使用消息内容的情况下过滤这些内容的最佳方法是什么?

编辑:它们看起来都具有相同的 HResult 值。

【问题讨论】:

  • 你检查过他们的InnerException吗?
  • 您可以使用非常特定的范围立即捕获它并重新抛出自定义异常,或者您必须依赖错误消息。尽管 C#6 让这变得不那么糟糕:druss.co/2015/05/c-6-0-exception-filters-try-catch-when
  • @Alex 我会仔细检查是否存在 InnerException。在某些情况下,这可能是一种选择,但这并不是真正的解决方案
  • @Rob 就像我一样。谢谢你的链接,这是个有趣的消息。
  • 为什么重要?如果您可以处理产生异常的情况,那么它永远不会被抛出。因此,即使你能区分它们,那又有什么帮助呢?

标签: c# .net exception exception-handling


【解决方案1】:

AFAIK,您可以区分相同 Type 的两个 Exceptions 只能通过 Message

但是,您应该依赖Message 来做出Catch 的决定。 Message 可能是 localized,具体取决于您执行代码的系统的区域设置。如果系统的语言与您硬编码的 Message 的语言不同,这将使您的 Catch When 块不相关。

您可以使用Message 的唯一情况是当您是系统管理员并为您将管理的服务器编写软件并且您确定您使用的语言将来不会改变时(即无法保证您编写的软件可以在客户端设备上运行)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多