C# 如何捕获自定义异常

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

我在“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
命令。 如果我将
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)捕获的,这是。。。不是它的工作原理。例外并不是捕获的内容。您严重误解了异常的工作原理和类继承的工作原理。如何捕获自定义异常?必须抛出该自定义异常或该异常的子类。