都是在普通的旧“异常”下捕获的异常类型

本文关键字:异常 类型 | 更新日期: 2023-09-27 17:50:08

我只是想更好地理解这一点。

我知道有许多不同的异常类型,根据我所做的一些阅读,所有异常类型都被异常捕获。 首先,我可以确信这是真的吗?

try{
    ...
}
catch(Exception x){
    //No matter what fails in the try block, x 
    //will always have a value since all exception
    //types are caught under Exception? I guess
    //What I really want to know, is will this ever
    //Fail?
}
catch(SystemException x){
    //This code will never execute since all 
    //exceptions are caught in the first catch?
}

接下来,这个捕获层次结构是如何工作的? 如果 Exception 位于顶部,则所有其他异常类型是否都在 Exception 下的一个级别,或者是否存在多个类型层,例如 Exception 是 ExceptionSomething 的父级,后者是 ExceptionSomethingElse 的父级?

补遗:

或者如果我们有这样的代码:

try{
    ...
}
catch(SystemException x){
    //If there is an exception that is not a SystemException
    //code in this block will not run, right (since this is 
    //looking specifically for SystemExceptions)?
}

都是在普通的旧“异常”下捕获的异常类型

这实际上取决于您的 .NET 版本和配置。在 C++/CLI 中,您可以扔任何东西;它不一定是Exception.在 1.1 (IIRC( 中,ou 只能使用捕获块来捕获这些内容,例如:

catch {...}

这不是很有帮助 - 你看不到发生了什么。在 2.0 (IIRC( 中,默认情况下此类异常会自动包装在虚拟RuntimeWrappedException子类中。但是,为了兼容,您可以将其关闭。我求求你:不要:)

是的,这是有效的,因为所有标准异常都继承自Exception

您的代码将起作用,但您需要将处理程序放在所有专用异常类型之后Exception。(将执行第一个匹配处理程序。

不会捕获不从Exception继承的异常,因为它们不是指定的类型。但是 .NET 异常类都继承自此基类。

有些人认为这不是一个好主意,但我通常只捕获Exception,除非我想对特定的异常类型进行特殊处理。

是的,Exception 继承自

Object 类,所有异常都继承自 Exception 类。

上面的链接将显示所有异常的层次结构。

System.Object 
  System.Exception
    Microsoft.Build.BuildEngine.InternalLoggerException
    Microsoft.Build.BuildEngine.InvalidProjectFileException
    Microsoft.Build.BuildEngine.InvalidToolsetDefinitionException
    Microsoft.Build.BuildEngine.RemoteErrorException
    ...

其中一些异常,如你提到的 SystemException,从它们继承了更多的异常,但它们仍然继承自 Exception 类:

System.Object 
  System.Exception
    System.SystemException
      Microsoft.SqlServer.Server.InvalidUdtException
      System.AccessViolationException
      System.Activities.ValidationException
      System.AppDomainUnloadedException
      System.ArgumentException
      System.ArithmeticException
      ...

为了回答问题的第二部分,.Net Framework 中的异常层次结构示例:

ArgumentNullException inherits from
ArgumentException inherits from
SystemException  inherits from
Exception     

您应该尝试处理最具体的情况。

try{
    //something
}
catch(ArgumentNullException ex){
    //handle ArgumentNullException
}
catch(SystemException ex1)
{
    //handle other kinds of SystemException
    if(IDontWantToHandleThisExceptionHere(ex1))
    {
        throw;//  not throw new Exception(ex1);
    }
}

后者,异常可以从基Exception类或继承基类的任何其他类继承。

例如:SqlException继承自DbException继承自ExternalException继承自SystemException最终继承自Exception

是的

,所有异常类型都继承自异常。

而且,继承

的工作方式,您可以拥有多个继承级别

MyAppException : Exception {
}
MyAppFileNotFoundException : MyAppException {
}

这通常用于具有不同类型的异常的不同行为

try {
     openfile('thisFileDoesNotExist.txt');
}
catch (MyAppFileNotFoundException ex)
{
      //warn the user the file does not exist
}
catch (Exception ex)
{
      //warn the user an unknown error occurred, log the error, etc
}