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

tryblock throws时IOException,它将调用第一个catch块,而不是第二个。谁能解释一下?为什么它调用第一个catch块?

4

5 回答 5

14

来自try-catch(C# 参考)

在同一个 try-catch 语句中可以使用多个特定的 catch 子句。在这种情况下,catch 子句的顺序很重要,因为 catch 子句是按顺序检查的。在不太具体的异常之前捕获更具体的异常。如果您对 catch 块进行排序以使后面的块永远无法到达,编译器会产生错误。

你应该使用

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

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

于 2013-03-25T07:22:37.563 回答
2

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

所以尝试使用IOCException之前Exception

您可以在此处查看 IOCException 的层次结构

于 2013-03-25T07:24:27.313 回答
0

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

于 2013-03-25T07:22:22.063 回答
0

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

于 2013-03-25T07:22:46.493 回答
0

它们按照您指定的顺序被捕获。在您的情况下,您应该放在IOException上面Exception。始终保持Exception原样。

于 2013-03-25T07:20:10.757 回答