当尝试处理异常时,顺序catch块

本文关键字:顺序 catch 异常 处理 | 更新日期: 2023-09-27 18:05:33

try
{
    // throws IOException
}
catch(Exception e)
{
}
catch(IOException e)
{
}

try块抛出IOException时,它将调用第一个catch块,而不是第二个CC_3块。有人能解释一下吗?为什么调用第一个catch块?

当尝试处理异常时,顺序catch块

try - catch (c#引用),

可以在同一个语句中使用多个特定的catch子句try - catch语句。在本例中,catch子句的顺序是重要是因为catch子句是按顺序检查的。赶上的更具体的异常在不太具体的异常之前。编译器如果对捕获块进行排序以使后面的块

你应该使用

try
{
    // throws IOException
}
catch(IOException e)
{
}
catch(Exception e)
{
}

注意,Exception类是所有异常的基类。

Exception类是所有异常的基类。因此,无论何时抛出任何类型的异常,它都将首先被第一个catch块捕获,该catch块可以捕获任何类型的异常。

所以试着在Exception之前使用IOCException

你可以在这里看到IOCException的层次结构

它们按照您指定的顺序被捕获。在您的情况下,您应该将IOException放在Exception之上。

原因是IOException派生自Exception,因此IOException实际上Exception ("is-a"),因此第一个catch处理程序匹配并被输入。

IOException继承自Exception。所有例外都是这样。当你首先捕获Exception时,你将捕获所有异常(包括IOException)。确保你的catch(Exception e)是列表中的最后一个catch,否则所有其他异常处理将被有效地忽略。