C# 我可以执行与一个try块对应的多个catch块吗?

C# 我可以执行与一个try块对应的多个catch块吗?,c#,java,C#,Java,假设我有一个包含3条语句的try块,它们都会导致异常。我希望所有3个异常都由它们相关的catch块处理。。可能吗 像这样的--> 是否可以获得以下输出?--> 是否有可能获得以下输出 不会,因为只会引发一个异常。一旦抛出异常,执行就会离开try块,并且假设存在匹配的catch块,它将继续执行。它不会返回到try块,因此不会出现第二个异常 try { try { throw new Exception("This is an exception."); }

假设我有一个包含3条语句的try块,它们都会导致异常。我希望所有3个异常都由它们相关的catch块处理。。可能吗

像这样的-->

是否可以获得以下输出?-->

是否有可能获得以下输出

不会,因为只会引发一个异常。一旦抛出异常,执行就会离开
try
块,并且假设存在匹配的
catch
块,它将继续执行。它不会返回到
try
块,因此不会出现第二个异常

try
{
    try
    {
        throw new Exception("This is an exception.");
    }
    catch(Exception foo)
    {
        System.Console.WriteLine(foo.Message);
        throw; // rethrows foo for the next handler.
    }
}
catch(Exception bar)
{
    System.Console.WriteLine("And again: " + bar.Message);
}

有关异常处理的一般课程以及更多详细信息,请参阅。如果要捕获多个异常,必须将代码拆分为多个try/catch块


更好的方法是在不触发异常的情况下验证数据和日志错误。

要添加到Jon的答案中,虽然您不会从单个
try
块捕获多个异常,但您可以让多个处理程序处理单个异常

try
{
    try
    {
        throw new Exception("This is an exception.");
    }
    catch(Exception foo)
    {
        System.Console.WriteLine(foo.Message);
        throw; // rethrows foo for the next handler.
    }
}
catch(Exception bar)
{
    System.Console.WriteLine("And again: " + bar.Message);
}
这将产生以下输出:

This is an exception.
And again: This is an exception.

这是一个非常糟糕的做法,但您可以做下一步(使用
finally
block解决您的问题):


同时显示所有异常处理是不可能的。每个异常
catch
的目标是对每个
exception
类型有不同的处理,否则将它们一起打印是没有意义的

不,

它不会执行所有三条catch语句。TRY块检查错误,然后从TRY块执行。然后将执行适当的捕获。在您的例子中,算术异常位于异常层次结构的顶部。因此,它将执行,然后程序终止


如果在算术异常之前给出,Catch(异常e),则将执行异常捕获。。。更好地阅读

上的SystemException层次结构,您认为这样的日志消息会有任何帮助吗?
This is an exception.
And again: This is an exception.
private static void Main()
        {
            int[] c={1};
            String s="this is a false integer";
            try
            {
                int z = 0;
                int x = 5/z;
            }
            catch (ArithmeticException exception)
            {
                Console.WriteLine(exception.GetType().ToString());
            }
            finally
            {
                try
                {
                    c[10] = 12;
                }
                catch(IndexOutOfRangeException exception)
                {
                    Console.WriteLine(exception.GetType().ToString());
                }
                finally
                {
                    try
                    {
                        int y = int.Parse(s);
                    }
                    catch (FormatException exception)
                    {
                        Console.WriteLine(exception.GetType().ToString());
                    }
                }

                Console.ReadKey();
            }
        }