多个catch块的执行

6

可能是重复问题:
执行多个catch块

一个try语句是否可以执行多个catch块?我们如何处理这些catch块?我们可以创建没有catch块的try吗?


8
你尝试过吗?你的电脑上安装了Visual Studio吗?如果没有,我建议你开始安装它。然后运行它。接着创建一个新项目,在其中尝试一些操作并且玩转C#。当你在使用C#代码时遇到问题时,请毫不犹豫地回到StackOverflow,在那里展示你编写的代码并提出问题。 - Darin Dimitrov
1
我是一个异常处理的初学者,所以我想更多地了解它们。 - chandra sekhar
3
当然,打开Visual Studio,创建一个新的控制台应用程序并尝试编写代码。此外,MSDN文档可以帮助你入门。你所提出的问题可以通过写几行代码轻松验证。试试看 - 你会发现编译器会指导你。你可以使用调试器在代码中设置断点,以便在运行时逐步跟踪程序执行流程。我的意思是,在向互联网论坛提问之前,你应该真正尝试一些东西。 - Darin Dimitrov
http://msdn.microsoft.com/en-us/library/ms173160(v=vs.80).aspx - horgh
5
@DarinDimitrov 的意思是,尽管你在 Stack Overflow 上得到了很多答案,但它并不是来教你如何编程的。Stack Overflow 最初是为那些在其解决方案的代码中遇到障碍的人创建的。最近出现了更多这样的问题,人们也因此获得了很多声望,但是 Darin 是100%正确的,这甚至不应该在这里问。为了保持一致性,我将删除我的答案,Darin。 - Mike Perrenoud
显示剩余2条评论
8个回答

18

可以有多个catch块(正如其他答案中所说),但只有第一个匹配异常类型的块会被执行。这意味着您需要正确排序catch块。例如:

try
{
}
catch (Exception exp1)
{
    // Block 1
}
catch (IOException exp2)
{
    // Block 2
}

由于块1捕获了所有的异常(所有异常类都派生自 Exception ),因此永远不会执行块2。

try
{
}
catch (IOException exp1)
{
    // Block 1
}

catch (Exception exp2)
{
    // Block 2
}

在这个例子中,只有当异常不是IOException或派生自IOException时,块2才会执行。如果抛出了一个IOException,那么只有块1会执行,块2不会执行。


4
  • 您可以在try块中关联多个catch块,但只有一个catch块可以处理您的异常。
  • 是的,您可以有一个没有catch的try块,但必须有一个finally块。

当一个catch块捕获了异常,其他的catch块是否会执行? - chandra sekhar
你可以轻松地管理异常并将其传播到另一个块,即使我确实不知道它如何有帮助。 - sataniccrow

1

从技术上讲,您只能捕获一个异常,但是您说:

在单个try语句中,是否可以执行多个catch块?

关键词是“执行”。因此,您可以尝试:

catch (Exception ex)            
{                
    if (ex is MyException1||
        ex is MyException2)
    {
       //do stuff
    }
    else
    {
       throw;
    }
}

0

是的,您可以在try语句中使用多个catch块。您可以从捕获特定异常开始,然后在最后一个块中捕获基本Exception。只有一个catch块会处理您的异常。

您可以没有catch块的try块。尝试/最终将完成。

        try
        {
            Console.Write("test");
        }
        catch (IOException ex)
        {
        }
        catch (ArithmeticException ex)
        {
        }
        catch (Exception ex)
        {
        }

尝试而不捕获

        try
        {
        }
        finally
        {
        }

如果一个catch块处理了异常,其他catch块会发生什么? - chandra sekhar
@chandrasekhar - 没有任何东西。只有一个catch块会执行。 - Chris Dunaway

0

是的,可以有多个catch,一个catch用于一个特定的异常

示例

try
{
    ...
}
catch (FormatException)
{
    ....
}
catch (OverflowException)
{
    ...
}

2 你可以使用try指令而不需要catch

try
{
 ...
}
Finally
{
  .....
}

0
关于你问题的第二部分,你可以选择以下任意一种方式:
try
{
    stuff...
}
catch(Exception ex){}

或者

try
{
    stuff...
}
finally{}

但你不能仅使用try。


0

只有一个catch块将被执行,它将是最接近抛出的Exception类型的catch。 你不能只有一个try。你需要一个try catch(一个或多个catch块)或一个try finally或一个try catch finally


0

您可以在一个 try...catch 语句中有任意数量的 catch 块。

但请记住一件事,那就是您的

catch (Exception ex)
{
    ...
}

应该是最后一个 catch 块,因为所有异常都继承自 Exception 类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接