【问题标题】:Catching exceptions with try-catch使用 try-catch 捕获异常
【发布时间】:2014-01-09 07:35:49
【问题描述】:

我不太明白"proper exception handling"这个话题。

“只有当你可以做一些事情来修复异常时才应该被捕获 这种特殊情况”。

我不明白这一点。例如: 如果我没有捕捉到Convert.toInt() 抛出的FormatException,即使只是向用户显示异常消息,我的程序也会崩溃。如果我发现了这个异常并且只是告诉用户输入的格式有误,它会继续存在。

那么,我应该捕获这些异常吗?

【问题讨论】:

  • 程序总是会因为UnhandledExceptions而崩溃

标签: c# exception exception-handling


【解决方案1】:

只有在您可以采取措施修复时才应捕获异常 这种特殊情况

fixing 在这里可能不是最好的词。如果你能处理它,你应该捕获异常。处理可能意味着:

  • 修复问题或返回一些默认值
  • 正在重试某事
  • 记录或通知用户(我相信应该记录每个异常,即使您可以修复它)
  • 抛出更多高级异常

但是你不应该捕获异常并且什么都不做:

catch(FormatException ex)
{
}

这只是吞下异常,你永远不会知道是否发生了不好的事情。

【讨论】:

    【解决方案2】:

    这并不意味着您让异常未处理。这意味着应用程序的正确流程是不可能的,因此代码应该返回并通知调用者(异常或消息)。在您的情况下,由于输入无效,因此您应该处理异常并让调用者知道这里出了什么问题。

    【讨论】:

      【解决方案3】:

      这是一个很难回答的问题,它当然取决于您的设计、应用偏好。

      在处理异常时,我尝试遵循以下规则:

      • 仅捕获我可以处理和恢复的异常(例如发送通知电子邮件)。应用程序可能会继续执行其任务而只是不通知用户 - 您不希望它通知的进程仅仅因为您的电子邮件服务器已关闭而崩溃。
      • 不要按异常编程,优先使用 int.TryParse( ) 进行检查,而不是依赖异常来指示程序流程。
      • 始终在异常到达服务边界之前捕获它们。这可能是 UI、WebService 或某个接口。您不应向用户显示异常,而应将其记录下来并向消费者返回一条用户友好的消息(或错误代码)。

      当然,每个人对错误处理都有不同的看法,因此很难得到明确的答案。我的建议是建立你自己的一套规则(除非有人付钱给你,在这种情况下遵循他们的规则!)。

      【讨论】:

      • 从你已经得到的答案的数量可以看出 - 很多人对这个话题有强烈的感情!
      【解决方案4】:

      换句话说,不要捕获你不知道如何处理的异常。最终,任何异常都应该在某个时候得到处理(这样你的程序就不会崩溃),但你应该有一个合理的策略,何时以及如何去做。

      【讨论】:

        【解决方案5】:

        是的,我认为你应该捕获这个异常,因为实际上你可以在你的 catch 块中通过警告用户他的输入格式错误来处理它。

        还有其他解决方案可以避免出现格式异常的可能性,例如,如果您要求输入整数并且您的应用程序是 WPF/Winform/Web 应用程序,您可以使用 NumericUpDown 控件来确保用户输入整数。你也可以使用这种代码,这样你就不必管理异常了:

        if (int.TryParse(userEnteredValue, out resultInt))
        {
        
        }
        

        【讨论】:

          【解决方案6】:

          如果我没有捕获 Convert.toInt() 抛出的 FormatException,即使它只是向用户显示异常消息,我的程序也会崩溃。

          是的,这是一个可以正确处理的异常情况。预计会发生来自用户的错误输入,您应该处理它。

          不过,还有其他类别的错误,您无能为力。例如,OutOfMemoryException

          【讨论】:

            【解决方案7】:

            “修复”这种情况并不一定是纠正它。当您发现错误并通知用户此错误时,这可能足以“修复”它。例如。您可以让用户更正输入。

            你的引用意味着你不应该做这样的事情:

            try
            {
                // do something which can throw
            }
            catch(Exception ex) // even this is bad practice as you should try to catch specific exceptions
            {
                // do nothing
            }
            

            【讨论】:

              【解决方案8】:

              这取决于您在捕获特定异常时可以为用户提供的可用性。

              假设您正在根据用户输入的参数进行一些计算,并且有一个字段是可选的。

              现在,如果用户为该字段而不是数字字段输入一些字符串,如果您没有捕获异常,您的程序将崩溃。

              但是,即使你捕获了那个异常,你的计算也不会完成,因为你将在抛出异常后跳过计算。

              但是在这种情况下,您可以做的是检查是否为该可选字段抛出了FormatException。如果是,请使用 catch 忽略异常并将值设置为某个默认值,例如 0,然后照常进行计算。

              【讨论】:

                猜你喜欢
                • 2015-06-21
                • 2011-05-27
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-12-05
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多