2014-01-09 99 views
1

我不完全把主题"proper exception handling"写进我的脑海。用try-catch捕捉异常

“只有在您可以采取一些措施修复 这种特殊情况时才能发现异常。

我不明白这一点。例如: 如果我不记得Convert.toInt()引发的FormatException,即使它只是向用户显示异常消息,我的程序也会崩溃。如果我发现了这个异常,并告诉用户输入的格式不正确,它就会存活下来。

那么,我应该捕捉这种例外吗?

+0

程序将永远为'UnhandledExceptions' – Ravi

回答

4

例外只应只捉到,如果你能做些什么来解决 因特殊情况

这里固定也许不是最好的词。如果你能处理它,你应该捕获异常。处理可能是:

  • 修复问题或返回一些默认值
  • 重试的东西
  • 记录或通知用户(我相信每一个例外,应该被记录下来,即使你能解决这个问题)
  • 投入更多高层次的例外

但你不应该捕捉异常,什么也不做:

catch(FormatException ex) 
{ 
} 

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

1

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

0

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

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

虽然还有其他类的错误,但你可以做的事情很少。例如,一个OutOfMemoryException

0

“修复”这种情况并不一定要纠正它。当你发现一个错误并告知用户这个错误时,这可能足以“修复”它。例如,你可以让用户改正输入。

你的报价意味着你不应该做这样的事情:

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

这取决于什么可用性可以提供给用户,同时捕捉该特定例外。

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

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

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

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

1

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

当处理异常我尽量遵守以下规则:

  • 只有赶上例外,我可以处理和恢复(例如发送电子邮件通知)。应用程序可以继续执行任务,并且不通知用户 - 您不希望因为您的电子邮件服务器关闭而导致其通知崩溃的进程。
  • 不要编程异常,优先使用int.TryParse()来检查而不是依靠异常来指定程序流。
  • 务必在服务边界到达之前捕捉异常。这可能是UI,WebService或某个接口。您不应该向用户显示异常,而应该记录并向用户返回用户友好的消息(或错误代码)。

当然,每个人在错误处理方面都有不同的意见,所以很难得到明确的答案。我的建议是建立你自己的规则(除非有人向你付钱,在这种情况下跟着他们!)。

+0

崩溃,你可以通过你已经有答案的数目看 - 大量的的人对这个话题有强烈的感受! – Liath

1

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

1

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

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

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

}