如何捕获自定义异常

本文关键字:自定义异常 何捕获 | 更新日期: 2023-09-27 18:32:41

我在'main'方法中有以下代码:

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命令。如果我用Exception替换MyException,则会捕获异常并且程序不会中断。

如何捕获自定义异常?

如何捕获自定义异常

你的代码无法捕获MyException,因为没有抛出任何异常; 显然你无法捕获未抛出的异常...但是,此代码将抛出并捕获MyException

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

如注释中所述,问题不在于您无法捕获异常,问题在于代码没有引发这种类型的异常。它抛出了一个System.DivideByZeroException.如果你想测试你的代码,看看它捕获了你的异常,那么只需用throw new MyException();替换b /= a;,你会看到它捕获了你的异常。当您使用基类Exception时,它会捕获某些内容,因为DivicdeByZeroException也继承自Exception

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

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

您可以捕获类型 Exception 的异常,因为DivideByZeroException扩展Exception 。您的MyException也扩展了Exception,但它是一种更派生的Exception类型,不是DivideByZeroException

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

反之

亦然: 如果你定义
public class MyException : DivideByZeroException
{
    public MyException() { }
}

和使用

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

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