C# 如何捕获自定义异常
我在“main”方法中有以下代码:C# 如何捕获自定义异常,c#,exception,custom-exceptions,C#,Exception,Custom Exceptions,我在“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 MyExcepti
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
命令。
如果我将MyException
替换为Exception
,则会捕获异常,并且程序不会中断
如何捕获自定义异常 您的代码无法捕获
MyException
,因为没有抛出任何异常;显然,您无法捕获未引发的异常。。。但是,此代码将抛出并捕获MyException
:
static void Main(string[] args)
{
try
{
Foo();
}
catch (MyException ex)
{
Console.WriteLine(ex.Message)
}
}
static void Foo()
{
throw new MyException()
}
正如注释中提到的,问题不是您不能捕获异常,问题是代码没有抛出这种类型的异常。它抛出一个
系统.DivideByZeroException
。如果你想测试你的代码,看它是否捕捉到你的异常,那么只需替换b/=a使用抛出新的MyException()代码>您将看到它捕获您的异常。当您使用基类Exception
时,它会捕获一些内容,因为DivicdeByZeroException
也继承自Exception
请记住,抛出异常的唯一方法是使用以下行thrownewmyException()代码>某处。您可以创建所需的所有自定义异常,但是.NET库不会只是开始为您抛出它们。在这种情况下,您甚至不应该使用自定义异常,如果这是一个学习练习,这很好,但当您已经抛出一个信息性异常时,它就没有意义了。正如Random832所指出的,行b/=a
抛出一个系统。DivideByZeroException
。DivideByZeroException
不等于MyException
您可以捕获类型为exception
的异常,因为DivideByZeroException
扩展了exception
。您的MyException
也扩展了异常
,但它是一种更派生的异常
,而不是一个除以零的异常
异常处理本质上是遍历层次结构。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
捕获您指定的异常,及其后代为什么b/=a
会抛出您的异常?它抛出一个系统.DivideByZeroException
。如果要捕获异常,必须抛出异常。您认为通过创建自定义异常可以实现什么?因为MyException是从exception继承的。这就是我希望捕获任何异常的原因。如果抛出的是DevisionByZeroException,因为此异常不可强制转换为MyException,所以它不是由catch(MyException)捕获的,这是。。。不是它的工作原理。例外并不是捕获的内容。您严重误解了异常的工作原理和类继承的工作原理。如何捕获自定义异常?必须抛出该自定义异常或该异常的子类。