使用try-catch捕获异常

时间:2014-01-09 07:35:49

标签: c# exception exception-handling

我不太清楚我的主题"proper exception handling"

  

“只有在您可以采取措施修复时才能捕获例外情况   这种特殊情况“。

我不明白这一点。例如: 如果我没有抓住FormatException抛出的Convert.toInt(),即使它只是向用户显示异常消息,我的程序也会崩溃。如果我抓住了这个异常并且只是告诉用户输入的格式错误,那么它就能幸免于难。

那么,我是否应该抓住这些例外?

8 个答案:

答案 0 :(得分:4)

  

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

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

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

但是你不应该抓住异常而不做任何事情:

catch(FormatException ex)
{
}

只是吞下了异常,你永远不会知道是不是发生了什么事。

答案 1 :(得分:1)

这并不意味着你让异常处理不当。这意味着无法正确应用程序流,因此代码应返回并通知调用者(异常或消息)。在你的情况下,因为输入是无效的,所以你应该处理异常并让调用者知道这里有什么问题。

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:1)

换句话说,不要捕捉您不知道如何处理的异常。最终应该在某个时候处理任何异常(因此你的程序不会崩溃),但你应该在何时以及如何做到这一点时制定合理的策略。

答案 4 :(得分:1)

是的,我认为您应该捕获此异常,因为实际上您可以通过警告用户输入的格式错误来处理它。

还有其他解决方案可以避免出现格式异常的可能性,例如,如果您要求一个整数,而您的应用程序是WPF / Winform / Web应用程序,则可以使用NumericUpDown控件来确保用户输入整数。此外,您可以使用此类代码,因此您无需管理例外:

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

}

答案 5 :(得分:0)

  

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

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

但是还有其他类别的错误,你可以做的事情很少。例如,OutOfMemoryException

答案 6 :(得分:0)

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

您的引用意味着您不应该这样做:

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

答案 7 :(得分:0)

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

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

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

Bu,即使你遇到了这个异常,你的计算也不会完成,因为你会在抛出异常后跳过计算。

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