【问题标题】:C# Can a custom exception catch/kill itself?C# 自定义异常可以捕获/杀死自己吗?
【发布时间】:2018-04-24 14:07:25
【问题描述】:

我的代码是这样的

var i = 0;
try
{
    i = faultyProcedure();
}
catch (Exception ex)
{
    try
    {
        throw new CustomException("faultyProcedure called", ex);
    }
    catch (CustomException) {}
}

虽然有效,但看起来很傻。 自定义异常会执行所有日志记录、邮件发送等操作,甚至在必要时退出应用程序。

有没有办法让自定义异常捕获/杀死自己,所以不需要内部的 try/catch 块?

【问题讨论】:

  • 你的意思是CustomException constructor 能完成所有这些工作吗?如果是这样,只需将其移动到您可以调用而不会引发异常的方法中。
  • 创建一个继承自 Exception 的类,然后在需要处理该异常的任何地方将其抛出到外部 catchMSDN
  • 你为什么要抛出 CustomException 呢?只为了下一刻捕捉?您的 CustomException 仅用于异常处理(日志记录、邮件等) - 将原始异常传递给将执行此操作的方法。

标签: c# custom-exceptions custom-error-handling


【解决方案1】:

所以...您正在使用您的CustomException 来处理其他异常?如果是这样的话,我很抱歉要告诉你,但这不只是看起来很傻,它很傻。

这不是例外的用途。

异常旨在指示异常情况,主要是您在编写代码时无法控制的事情,例如 IO 或网络问题。

要处理异常,您可以将代码写入任何类,但抛出新异常只是为了处理被 catch 子句捕获的异常是没有意义的。

我相信这是vexing exception 的一个例子:

烦恼异常是不幸的设计决策的结果。令人烦恼的异常是在完全非异常的情况下抛出的,因此必须一直被捕获和处理。

Eric Lippert 博客中的示例是 int.Parse,但我认为这段代码与一个令人烦恼的异常示例一样有效。

【讨论】:

  • 谢谢,有趣的阅读,你说得对!我的目标是整理所有异常,记录它们,邮寄它们,显示自定义错误消息。显然,如果我不需要为此自定义异常,我不必事后捕获它。
  • 很高兴为您提供帮助 :-)
猜你喜欢
  • 2011-12-12
  • 2011-01-31
  • 1970-01-01
  • 2011-09-22
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
  • 1970-01-01
相关资源
最近更新 更多