return可以抛出异常吗?

c#

在玩 C# 时,我发现了以下代码段:

public int F() 
{
    try 
    {
        return 0;
    } 
    catch (Exception)
    {
        return -1;
    }
}

这将生成以下asm

Program.F()
    L0000: push ebp
    L0001: mov ebp, esp
    L0003: push esi
    L0004: sub esp, 0x14
    L0007: xor eax, eax
    L0009: mov [ebp-0x18], eax
    L000c: mov [ebp-0x14], eax
    L000f: mov [ebp-0x10], eax
    L0012: mov [ebp-0xc], eax
    L0015: xor esi, esi
    L0017: jmp short L0023
    L0019: mov esi, 0xffffffff
    L001e: call 0x6fb2d4d3
    L0023: mov eax, esi
    L0025: lea esp, [ebp-4]
    L0028: pop esi
    L0029: pop ebp
    L002a: ret
Program.F()
    L0000: push ebp
    L0001: mov ebp, esp
    L0003: push esi
    L0004: sub esp, 0x14
    L0007: xor eax, eax
    L0009: mov [ebp-0x18], eax
    L000c: mov [ebp-0x14], eax
    L000f: mov [ebp-0x10], eax
    L0012: mov [ebp-0xc], eax
    L0015: xor esi, esi
    L0017: jmp short L0023
    L0019: mov esi, 0xffffffff
    L001e: call 0x6fb2d4d3
    L0023: mov eax, esi
    L0025: lea esp, [ebp-4]
    L0028: pop esi
    L0029: pop ebp
    L002a: ret

当我删除trycatch阻止时:

那么生成的输出是:

Program.F()
    L0000: xor eax, eax
    L0002: ret

正如您所看到的,JIT (Release) 知道它不会返回-1(您找不到任何会跳转到return -1case 的分支),但它确实为return 0case生成了 try 块。问题是 return 语句是否会抛出异常或者为什么 JIT 会为其生成asm

笔记

相比之下:这就是输出g++(O2) 的内容C++

public int F() 
{
    return 0;
}

汇编

f(void*):
        xor     eax, eax
        ret

回答

由于语句中允许的表达式的通用性质,return 语句通常会导致异常——通常,表达式会导致异常。

知道表达式0不能抛出,JIT 是否应该优化异常处理?也许,在一个完美的世界里。有人抱怨这个吗?


以上是return可以抛出异常吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>