Nit*_*ari 8 .net il exception-handling
我正在使用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
Run Code Online (Sandbox Code Playgroud)
这不起作用,我得到字符串"在对象捕获",但当我尝试取消框时,我得到一个System.InvalidCastException:指定的强制转换是无效的.我怎样才能获得抛出的价值?
在CLR的2.0版本中,当抛出非CLS兼容的异常时,CLR会自动构造RuntimeWrappedException类的实例并初始化其私有字段以引用实际抛出的对象.实际上,CLR现在将所有符合CLS的异常转换为符合CLS的异常.
try
{
// ...
}
catch (RuntimeWrappedException e)
{
int a = (int)e.WrappedException;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
206 次 |
| 最近记录: |