我在'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
,则会捕获异常并且程序不会中断。
如何捕获自定义异常?
答案 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.DivideByZeroException
。 DivideByZeroException
不等于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
捕获您指定的例外,及其后代。