如何捕获自定义异常

时间:2013-09-24 16:06:03

标签: 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 MyException : Exception
{
    public MyException()
    {

    }
}

程序在b /= a;上中断,而我希望它转到catch命令。 如果我将MyException替换为Exception,则会捕获异常并且程序不会中断。

如何捕获自定义异常?

5 个答案:

答案 0 :(得分:4)

您的代码无法捕获MyException,因为没有抛出;很明显你无法捕获一个未被抛出的异常...但是,这段代码会抛出并捕获MyException

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

static void Foo()
{
    throw new MyException()
}

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

您可以捕获Exception类型的例外,因为DivideByZeroException扩展了Exception。您的MyException也扩展了Exception,但它是Exception的派生类型,不是 DivideByZeroException

答案 3 :(得分:1)

异常处理实际上是遍历层次结构。 DivByZero没有处理程序,可能是它的父级,然后是它的父级,依此类推。所有异常的父级都是异常,因此这就是您的代码最终捕获的原因。为什么它没有捕获MyException是因为没有从DivByZero到MyException的链接。 MyException是在一个单独的分支上。

答案 4 :(得分:0)

反过来说:如果你定义

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

并使用

static void Main(string[] args)
{
    try
    {
         throw new MyException();
    }
    catch (DivideByZeroException ex)
    {
         Console.WriteLine("Exception caught");
    }
}
然后你的捕获就会起作用。 catch捕获您指定的例外,及其后代