我不完全把主题"proper exception handling"
写进我的脑海。用try-catch捕捉异常
“只有在您可以采取一些措施修复 这种特殊情况时才能发现异常。
我不明白这一点。例如: 如果我不记得Convert.toInt()
引发的FormatException
,即使它只是向用户显示异常消息,我的程序也会崩溃。如果我发现了这个异常,并告诉用户输入的格式不正确,它就会存活下来。
那么,我应该捕捉这种例外吗?
我不完全把主题"proper exception handling"
写进我的脑海。用try-catch捕捉异常
“只有在您可以采取一些措施修复 这种特殊情况时才能发现异常。
我不明白这一点。例如: 如果我不记得Convert.toInt()
引发的FormatException
,即使它只是向用户显示异常消息,我的程序也会崩溃。如果我发现了这个异常,并告诉用户输入的格式不正确,它就会存活下来。
那么,我应该捕捉这种例外吗?
例外只应只捉到,如果你能做些什么来解决 因特殊情况
这里固定也许不是最好的词。如果你能处理它,你应该捕获异常。处理可能是:
但你不应该捕捉异常,什么也不做:
catch(FormatException ex)
{
}
这只是吞噬异常,你永远不会知道是否发生了什么坏事。
这并不意味着你让异常处理不了。这意味着正确的应用程序流是不可能的,因此代码应该返回并通知调用者(例外或消息)。而在你的情况下,由于输入无效,所以你应该处理异常并让调用者知道这里有什么问题。
如果我不捕获Convert.toInt()引发的FormatException,即使它只是向用户显示异常消息,我的程序也会崩溃。
对,这是一个例外情况,可以正确处理。预期会发生来自用户的错误输入,您应该处理它。
虽然还有其他类的错误,但你可以做的事情很少。例如,一个OutOfMemoryException
。
“修复”这种情况并不一定要纠正它。当你发现一个错误并告知用户这个错误时,这可能足以“修复”它。例如,你可以让用户改正输入。
你的报价意味着你不应该做这样的事情:
try
{
// do something which can throw
}
catch(Exception ex) // even this is bad practice as you should try to catch specific exceptions
{
// do nothing
}
这取决于什么可用性可以提供给用户,同时捕捉该特定例外。
假设您正在根据用户输入的参数进行一些计算,并且有一个字段是可选的。
现在,如果用户为该字段输入一些字符串而不是数字字段,那么如果没有捕获异常,程序将崩溃。
即使你发现了这个异常,你的计算也不会完成,因为你将在抛出异常后跳过计算。
但是在这种情况下你可以做的是,检查FormatException
是否被抛出用于该可选字段。如果是,则使用catch忽略该异常并将该值设置为某个默认值,例如0,然后照常进行计算。
这是一个难以回答的问题,当然取决于您的设计,应用程序偏好。
当处理异常我尽量遵守以下规则:
当然,每个人在错误处理方面都有不同的意见,所以很难得到明确的答案。我的建议是建立你自己的规则(除非有人向你付钱,在这种情况下跟着他们!)。
崩溃,你可以通过你已经有答案的数目看 - 大量的的人对这个话题有强烈的感受! – Liath
换句话说,不要捕捉你不知道如何处理的异常。最终,任何异常都应该在某个时候处理(所以你的程序不会崩溃),但是你应该有一个合理的策略,以及如何做到这一点。
是的,我认为你应该捕捉这个异常,因为实际上你可以通过警告用户输入错误的格式来处理它。
还有其他解决方案可以避免出现格式异常,例如,如果您要求输入一个整数,并且您的应用程序的WPF/Winform/Web应用程序可以使用NumericUpDown控件来确保用户输入一个整数。你也可以使用这种代码,这样你就不必管理例外:
if (int.TryParse(userEnteredValue, out resultInt))
{
}
程序将永远为'UnhandledExceptions' – Ravi