对一般捕获子句发出系统的任何实际含义.对象作为类型筛选器

本文关键字:对象 筛选 类型 任何实 子句 系统 | 更新日期: 2023-09-27 17:50:26

我记得曾经听人说过,抛出System.Exception(或扩展它的对象)以外的其他类型的对象在技术上是合法的CIL,尽管c#没有支持它的特性。所以我很感兴趣地看到下面的c#代码:

try {
    throw new Exception();
} catch(Exception x) {
    try {
        throw;
    } catch {
        Console.Write("yes");
    }
}

编译为以下CIL:

  .try
  {
    IL_0000:  newobj     instance void [mscorlib]System.Exception::.ctor()
    IL_0005:  throw
  }  // end .try
  catch [mscorlib]System.Exception 
  {
    IL_0006:  pop
    .try
    {
      IL_0007:  rethrow
    }  // end .try
    catch [mscorlib]System.Object 
    {
      IL_0009:  pop
      IL_000a:  ldstr      "yes"
      IL_000f:  call       void [mscorlib]System.Console::Write(string)
      IL_0014:  leave.s    IL_0016
    }  // end handler
    IL_0016:  leave.s    IL_0018
  }  // end handler

,我们看到嵌套的通用catch子句编译为:

catch [mscorlib]System.Object 
c#中的

,对于使用System.Object而不是System.Exception作为类型过滤器的通用catch子句,是否有实际意义?

对一般捕获子句发出系统的任何实际含义.对象作为类型筛选器

与。net -2.0不同。我在。net 1.1的时候读到过。

这里有解释(我就不抄了)。请注意,第一个答案是错误的,第二个答案是正确的。

关于它是否实用:否。