__except() 的处理2 --- 全局展开

__except() 的处理2 --- 全局展开


前面我们了解到对 EXCEPTION_EXECUTE_HANDLER 的处理,重要的一步会进行全局展开:

MSVCR100D!_except_handler4_common+0x118:
01152558 8b4de0          mov     ecx,dword ptr [ebp-20h]                  ; esp
0115255b 83c108          add     ecx,8                                    ; get prev_struct
0115255e 8b5510          mov     edx,dword ptr [ebp+10h]                  ; ExceptionRecord
01152561 e8ccb3ffff      call    MSVCR100D!_EH4_GlobalUnwind2 (0114d932)
01152566 8b55e0          mov     edx,dword ptr [ebp-20h]                  ; RegistrationNode
01152569 8b4214          mov     eax,dword ptr [edx+14h]                  ; get TryLevel
0115256c 3b45d8          cmp     eax,dword ptr [ebp-28h]                  ; TryLevel == eax
0115256f 7416            je      MSVCR100D!_except_handler4_common+0x147 (01152587)

给这个 EH4_GlobalUnwind2() 传递两个参数:

  • prev_struct
  • ExceptionRcord

这两个都是指针值,MSVCR100D!_EH4_GlobalUnwind2() 代码如下:

MSVCR100D!_EH4_GlobalUnwind2:
0110d932 55              push    ebp
0110d933 8bec            mov     ebp,esp
0110d935 53              push    ebx
0110d936 56              push    esi
0110d937 57              push    edi
0110d938 6a00            push    0
0110d93a 52              push    edx
0110d93b 6846d91001      push    offset MSVCR100D!_EH4_GlobalUnwind2+0x14 (0110d946)
0110d940 51              push    ecx
0110d941 e8f6ca0200      call    MSVCR100D!RtlUnwind (0113a43c)
0110d946 5f              pop     edi
0110d947 5e              pop     esi
0110d948 5b              pop     ebx
0110d949 5d              pop     ebp
0110d94a c3              ret

MSVCR100D!_EH4_GlobalUnwind2() 是一个转接层,最终的工作交由 MSVCR100D!RtlUnwind() 去执行,给 MSVCR100D!RtlUnwind() 传递 4 个参数:

它看起来像下面:

RtlUnwind(_EH4_EXCEPTION_REGISTRATION_RECORD *void *_EXCEPTION_RECORD *,

`try-except`是Python中用于异常处理的结。它允许我们在代码块中捕获异常并采取相应的操作,以避免程序崩溃。 `try-except`语句的基本语法如下: ```python try: # 可能会出现异常的代码块 # 如果出现异常,会立即跳转到对应的except代码块 pass except ExceptionType: # 异常处理代码块 # 在此处处理捕获到的异常 pass ``` 在上述代码中,`try`后面的代码块是我们要执行的可能会发生异常的代码。如果在执行过程中发生了指定类型的异常(可以是内置异常或自定义异常),程序会跳转到对应的`except`代码块进行处理。 接下来,让我们来看看`pass`关键字的作用。`pass`是Python中的一个空语句,它不执行任何操作。在异常处理中,有时我们可能不需要在`except`代码块中执行任何操作,只需要简单地忽略异常并继续执行后续代码。此时,可以使用`pass`关键字来占位,表示不做任何处理。 例如,下面的代码演示了如何使用`try-except`和`pass`来处理异常并继续执行: ```python try: num = 10 / 0 # 这里会触发 ZeroDivisionError 异常 except ZeroDivisionError: pass # 忽略异常,继续执行后续代码 print("程序继续执行") ``` 在上述代码中,由于除数为0,会触发`ZeroDivisionError`异常。但由于我们在`except`代码块中使用了`pass`,所以异常被忽略掉了,程序继续执行后续代码,输出结果为:"程序继续执行"。 希望这样的解释对你有所帮助!如果你还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值