【问题标题】:how to catch an int如何捕捉一个int
【发布时间】:2011-04-28 05:27:14
【问题描述】:

我正在使用 IL 抛出一个 Int32 并抓住它。这只是出于好奇,我不想实现任何目标,所以请不要告诉我抛出异常而不是 int。

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       40 (0x28)
  .maxstack  2
  .locals init (object V_0,
       int32 V_1)
  IL_0000:  nop
  .try
  {
    IL_0001:  nop
    IL_0002:  ldsfld     int32 ConsoleApplication3.Program::i
    IL_0007:  throw
  }  // end .try
  catch [mscorlib]System.Object 
  {
    IL_0008:  stloc.0
    IL_0009:  nop
    IL_000a:  ldstr      "In Object catch"
    IL_000f:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_0014:  nop
    IL_0015:  ldloc.0
    IL_0016:  unbox.any  [mscorlib]System.Int32
    IL_001b:  stloc.1
    IL_001c:  ldloc.1
    IL_001d:  call       void [mscorlib]System.Console::WriteLine(int32)
    IL_0022:  nop
    IL_0023:  nop
    IL_0024:  leave.s    IL_0026
  }  // end handler
  IL_0026:  nop
  IL_0027:  ret
} // end of method Program::Main

这不起作用,我得到字符串“In Object catch”,但是当我尝试拆箱时,我得到一个 System.InvalidCastException: Specified cast is not valid。 我怎样才能得到抛出的东西的价值?

【问题讨论】:

  • 先用C#写,再看IL?
  • 不能用 C# 写,因为 C# 作为一种语言不允许抛出 int
  • 由于 local 0 是 System.Exception 类型,因此您不能将其拆箱为 int 并不让我感到惊讶。
  • 是吗?我的伊尔福有那么差吗? .locals 指令说它是异常...此外,另一个本地 .1 被声明为 bool。
  • 改了 .locals init (object V_0, bool V_1) 结果还是一样

标签: .net exception-handling il


【解决方案1】:

在 CLR 2.0 版中,当一个 抛出不符合 CLS 的异常, CLR 自动构造一个 的实例 RuntimeWrappedException 类和 初始化其私有字段以引用 到实际上是的对象 抛出。实际上,CLR 现在转向 所有不符合 CLS 的例外情况 符合 CLS 的异常。

try
{
    // ...
}
catch (RuntimeWrappedException e)
{
    int a = (int)e.WrappedException;
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
相关资源
最近更新 更多