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

时间:2013-06-04 21:02:14

标签: c# java

考虑我有一个包含3个语句的try块,并且所有这些语句都会导致异常。我希望所有3个例外都由它们相关的catch块处理..是否可能?

类似的东西 - >

class multicatch
{
    public static void main(String[] args)
    {
        int[] c={1};
        String s="this is a false integer";
        try
        {
            int x=5/args.length;
            c[10]=12;
            int y=Integer.parseInt(s);
        }
        catch(ArithmeticException ae)
        {
            System.out.println("Cannot divide a number by zero.");
        }
        catch(ArrayIndexOutOfBoundsException abe)
        {
            System.out.println("This array index is not accessible.");
        }
        catch(NumberFormatException nfe)
        {
            System.out.println("Cannot parse a non-integer string.");
        }
    }
}

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

Cannot divide a number by zero.
This array index is not accessible.
Cannot parse a non-integer string.

6 个答案:

答案 0 :(得分:10)

  

是否可以获得以下输出?

不,因为只会抛出其中一个例外。抛出异常后,执行将离开try块,并假设存在匹配的catch块,它将继续存在。它不会返回try块,因此您无法获得第二个例外。

有关异常处理的一般教训,请参阅Java tutorial,有关详细信息,请参阅section 11.3 of the JLS

答案 1 :(得分:2)

如果要捕获多个异常,则必须将代码拆分为多个try / catch块。

更好的方法是验证您的数据并记录错误,而不会触发执行此操作的例外。

答案 2 :(得分:0)

要添加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.

答案 3 :(得分:0)

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

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();
            }
        } 

答案 4 :(得分:0)

一次显示所有异常处理是不可能的。每个例外catch的目标是对每个Exception类型进行不同的处理,否则将它们全部打印在一起毫无意义。

答案 5 :(得分:0)

  

不,

它不会执行所有三个catch语句。 TRY 块检查错误,然后执行来自TRY块。然后适合捕获将被执行。在您的情况下, ArithmeticException 位于异常层次结构的顶部。因此它将执行,然后程序终止。

如果你在 ArithmeticException 之前给出 Catch(例外e),那么将执行异常捕获...更好地阅读MSDN <上的SystemException层次结构/ p>