【问题标题】:How to Catch Custom Exception如何捕获自定义异常
【发布时间】:2013-09-25 00:16:02
【问题描述】:

我在'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,则会捕获异常并且程序不会中断。

如何捕获自定义异常?

【问题讨论】:

  • 为什么b /= a 会抛出你的异常?它抛出一个System.DivideByZeroException。如果你想捕捉你的异常,你必须抛出你的异常。您认为通过创建自定义异常可以完成什么?
  • 因为 MyException 继承自 Exception。这就是为什么我希望捕获任何异常。
  • 如果抛出的是DevisionByZeroException,因为这个异常不能转换为MyException,它不会被catch(MyException)捕获
  • 那是......不是它的工作原理。例外不是捕捉。您严重误解了异常的工作方式和类继承的工作方式。
  • 如何捕获自定义异常?您必须抛出该自定义异常或该异常的子类。

标签: c# exception custom-exceptions


【解决方案1】:

您的代码无法捕获MyException,因为没有抛出任何内容;显然你不能捕获一个没有被抛出的异常......然而,这段代码会抛出并捕获MyException

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          正好相反:如果你定义

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

          并使用

          static void Main(string[] args)
          {
              try
              {
                   throw new MyException();
              }
              catch (DivideByZeroException ex)
              {
                   Console.WriteLine("Exception caught");
              }
          }
          

          那么你的捕获就会起作用。 catch 捕获您指定的异常,及其后代

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-05-24
            • 1970-01-01
            • 1970-01-01
            • 2011-01-31
            • 2015-06-07
            • 2015-07-14
            • 2023-03-18
            • 1970-01-01
            相关资源
            最近更新 更多