0

我在“主要”方法中有以下代码:

static void Main(string[] args)
{
    try
    {
         int a = 0;
         int b = 5;
         b /= a;
    }
    catch (MyException ex)
    {
         Console.WriteLine(ex.Message)
    }
}

MyException 类如下:

public class MyException : Exception
{
    public MyException()
    {

    }
}

该程序会中断,b /= a;而我希望它会执行catch命令。如果我替换MyExceptionException,则会捕获异常并且程序不会中断。

如何捕获自定义异常?

4

5 回答 5

4

您的代码无法捕获 a MyException,因为没有抛出;显然,您无法捕获未引发的异常...但是,此代码将 throw 和 catch MyException

static void Main(string[] args)
{
    try
    {
         Foo();
    }
    catch (MyException ex)
    {
         Console.WriteLine(ex.Message)
    }
}

static void Foo()
{
    throw new MyException()
}
于 2013-09-24T16:10:48.153 回答
2

正如 Random832 指出的那样,该行b /= a抛出一个System.DivideByZeroException. ADivideByZeroException不等于 a MyException

您可以捕获类型异常,Exception因为 a DivideByZeroExceptionextends Exception。你MyException也 extends Exception,但它是一种更派生的类型Exception不是 DivideByZeroException.

于 2013-09-24T16:13:22.883 回答
2

正如评论中提到的,问题不在于您无法捕获异常,问题在于代码没有抛出那种类型的异常。它抛出一个System.DivideByZeroException. 如果您想测试您的代码以查看它是否捕获您的异常,那么只需替换b /= a;throw new MyException();,您将看到它捕获您的异常。当您使用基类时,它会捕获一些东西,Exception因为它DivicdeByZeroException也继承自Exception.

请记住,抛出异常的唯一方法是在throw new MyException();某处有线路。您可以创建所有您想要的自定义异常,但 .NET 库不会只是开始为您抛出它们。在这种情况下,您甚至不应该使用自定义异常,如果这是一个很好的学习练习,但是当您已经抛出信息异常时,它就没有真正意义。

于 2013-09-24T16:12:54.240 回答
1

异常处理的作用本质上是向上遍历层次结构。DivByZero 没有处理程序,可能是它的父级,然后是它的父级等等。所有异常的父级是异常,所以这就是您的代码最终捕获的原因。为什么它没有捕获 MyException 是因为没有从 DivByZero 到 MyException 的链接。MyException 在一个单独的分支上。

于 2013-09-24T16:13:41.310 回答
0

恰恰相反:如果你定义

public class MyException : DivideByZeroException
{
    public MyException() { }
}

并使用

static void Main(string[] args)
{
    try
    {
         throw new MyException();
    }
    catch (DivideByZeroException ex)
    {
         Console.WriteLine("Exception caught");
    }
}

那么你的捕获就会起作用。catch捕获您指定的异常及其后代

于 2013-09-24T16:16:02.587 回答