【问题标题】:Do I need to catch each individual exception type if I'm going to perform the same action?如果我要执行相同的操作,是否需要捕获每个单独的异常类型?
【发布时间】:2013-11-07 19:08:57
【问题描述】:

简单地说,我不希望这个应用程序收到太多错误,因为它是一个相当受控的环境,并且用户是其他开发人员。

话虽如此,错误确实迟早会发生,我只是想记录它们并提醒用户。我有这种方法,它会尽可能地验证信息,然后尝试将文件从 A 复制到 B。

        try
        {
            File.Copy(source, destination, true);
            return String.Empty;
        }
        catch (Exception ex)
        {
            logOp.AddLog(ex);
            return string.Format("ERROR: {0}{1}{2}", ex.Message, Environment.NewLine, ex.StackTrace);
        }

如果成功,该方法返回一个空字符串,如果不成功,则记录异常并将其返回给调用方法进行演示。

如果我想要最详细的消息/堆栈跟踪,我是否需要捕获 File.Copy 可以抛出的每个单独的异常类型,还是只捕获异常有效?我尝试对其进行硬编码以抛出各种异常的新实例,看起来还可以,但我不确定是否有一些我遗漏/违反的编程原则

【问题讨论】:

  • 您使用String.Empty 表示成功?

标签: c# winforms exception-handling .net-3.5


【解决方案1】:

由于您在异常处理程序中所做的一切都是记录,所以我会说不,只需获取异常并记录消息。

如果您尝试从错误中恢复,则捕获单个异常会很有用。

【讨论】:

  • 是的,最初我为每个单独的块设置了 10 个不同的 Catch 块,然后意识到它看起来多么糟糕,因为每个块都在做完全相同的事情。只是不确定这个单一的“顶级”捕获是否会在实践中真正奏效。
【解决方案2】:

我会保持原样,只捕获基类异常。

像在 logOp.AddLog(ex) 中隐式那样记录 ex.ToString() 应该写入异常的实际类型(这可能是 File.Copy 方法可以抛出的其中之一 in the Exceptions section here

根据该链接,实际异常的名称应该提供足够的信息,因为您没有尝试从异常中恢复,只是记录它们。

【讨论】:

    猜你喜欢
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    相关资源
    最近更新 更多