如何捕获自定义异常
本文关键字:自定义异常 何捕获 | 更新日期: 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.DivideByZeroException
。DivideByZeroException
不等于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
捕获您指定的异常及其后代。