C# 使用try-catch捕获异常

C# 使用try-catch捕获异常,c#,exception,exception-handling,C#,Exception,Exception Handling,我没有完全理解主题“正确的异常处理” “只有在您可以采取措施进行修复时,才应捕获异常 这种特殊情况” 我不明白。例如: 如果我没有捕获由Convert.toInt()引发的FormatException,即使只是向用户显示异常消息,我的程序也会崩溃。如果我捕捉到了这个异常,并告诉用户输入的格式错误,它就会幸存下来 那么,我是否应该捕获这样的异常呢?这并不意味着你让异常未经处理。这意味着不可能实现正确的应用程序流,因此代码应该返回并通知调用方(异常或消息)。在您的情况下,由于输入无效,因此您应该处

我没有完全理解主题
“正确的异常处理”

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

我不明白。例如: 如果我没有捕获由
Convert.toInt()
引发的
FormatException
,即使只是向用户显示异常消息,我的程序也会崩溃。如果我捕捉到了这个异常,并告诉用户输入的格式错误,它就会幸存下来


那么,我是否应该捕获这样的异常呢?

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

这并不意味着您不处理异常。这意味着不可能实现正确的应用程序流,因此代码应该返回并通知调用方(异常或消息)。在您的情况下,由于输入是无效的,因此您应该处理异常,并让调用方知道此处的错误

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

对,这是一个可以正确处理的异常情况。用户的错误输入可能会发生,您应该对此进行处理

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

如果我没有捕获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
}
“纠正”这种情况并不一定就是纠正它。当您捕获错误并将此错误通知用户时,这可能足以“修复”它。例如。您可以让用户更正输入

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

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,然后像往常一样继续计算。

这取决于捕捉该特定异常时可以为用户提供的可用性

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

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

但是,即使捕获到该异常,您的计算也不会完成,因为在抛出该异常后,您将跳过计算

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

只有当您可以做一些事情来修复异常时,才应该捕获异常 这种特殊情况

修复可能不是这里最好的词。若您能处理异常,那个么您应该捕获它。处理可能意味着:

  • 修复问题或返回一些默认值
  • 重试某事
  • 记录或通知用户(我认为应该记录每个异常,即使您可以修复它)
  • 正在引发更多高级异常
但您不应该捕获异常,而什么也不做:

catch(FormatException ex)
{
}
这只是一个例外,你们永远不会知道是否发生了什么坏事

只有当您可以做一些事情来修复异常时,才应该捕获异常 这种特殊情况

修复可能不是这里最好的词。若您能处理异常,那个么您应该捕获它。处理可能意味着:

  • 修复问题或返回一些默认值
  • 重试某事
  • 记录或通知用户(我认为应该记录每个异常,即使您可以修复它)
  • 正在引发更多高级异常
但您不应该捕获异常,而什么也不做:

catch(FormatException ex)
{
}

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

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

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

  • 仅捕获我可以处理和恢复的异常(例如发送通知电子邮件)。应用程序有可能继续执行它的任务而不通知用户-您不希望它通知的进程因为您的