繁体   English   中英

使用try-catch捕获异常

[英]Catching exceptions with try-catch

我不太了解"proper exception handling"主题。

“只有在您可以采取某些措施来解决这种特殊情况时,才应捕获异常”。

我不明白 例如:如果我没有捕获Convert.toInt()抛出的FormatException ,即使只是向用户显示异常消息,我的程序也会崩溃。 如果我发现了此异常并只是告诉用户输入格式错误,那么该输入将继续存在。

那么,是否应该捕获此类异常?

仅当您可以采取某些措施来解决异常情况时,才应捕获异常

在这里修复也许不是最好的词。 如果可以处理,则应捕获异常。 处理可能意味着:

  • 解决问题或返回一些默认值
  • 重试一些
  • 记录或通知用户(我相信应该记录每个异常,即使您可以解决它)
  • 引发更多高级异常

但是您不应该捕获异常并且什么也不做:

catch(FormatException ex)
{
}

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

这并不意味着您让异常未处理。 这意味着无法正确应用程序,因此代码应返回并通知调用方(异常或消息)。 并且在您的情况下,因为输入无效,因此您应该处理异常,并让调用者知道此处的错误。

这是一个很难回答的问题,它当然取决于您的设计,应用程序首选项。

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

  • 仅捕获我可以处理并从中恢复的异常(例如,发送通知电子邮件)。 应用程序有可能继续执行其任务,而只是不通知用户-您不希望仅由于电子邮件服务器已关闭而通知其崩溃的过程。
  • 不要按例外编程,请按喜好使用int.TryParse()进行检查,而不要依靠异常来规定程序流程。
  • 在异常触及服务边界之前,请始终捕获异常。 这可以是UI,WebService或某些接口。 您不应向用户显示异常,而应将其记录下来并向用户返回漂亮的用户友好消息(或错误代码)。

当然,对于错误处理,每个人都有不同的看法,因此很难获得明确的答案。 我的建议是建立自己的规则集(除非有人付钱给您,否则请遵循他们的规则!)。

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

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

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

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

}

如果我没有捕捉到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
}

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

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

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

Bu,即使您捕获了该异常,您的计算也不会完成,因为在引发异常之后您将跳过计算。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM