在看《windows核心编程》第五版,其中提到了两个问题:
(1)_finally关键字后面的termination handler是出现异常的线程用自己的线程栈执行的吗?
(2)_except关键字后面的exception handler,原文中说“Unlike termination handlers ...the exception handlers is directly executed by the system.”这是否意味着这段handler执行是用的OS自身在某处的线程栈?如果是,那么为什么线程中的所有符号在exception handler中居然是可见的?
另外,原文中提到EXCEPTION_CONTINUE_EXECUTION宏时指出,这个方法是相当危险的,因为在出现异常后某些寄存器的值可能是不正常的,(C的一个语句没有被正确地执行完),这时回复执行同一条语句可能出现问题。那么,无论是_finally或者是_except,无论使用那种异常处理命令,出现异常后寄存器的值都可能是不正常的,这时即使另起一条新的C语句并且执行仍然有可能出现问题。这样的话异常处理其不是变成了赌汇编指令了么?
(1)_finally关键字后面的termination handler是出现异常的线程用自己的线程栈执行的吗?
(2)_except关键字后面的exception handler,原文中说“Unlike termination handlers ...the exception handlers is directly executed by the system.”这是否意味着这段handler执行是用的OS自身在某处的线程栈?如果是,那么为什么线程中的所有符号在exception handler中居然是可见的?
另外,原文中提到EXCEPTION_CONTINUE_EXECUTION宏时指出,这个方法是相当危险的,因为在出现异常后某些寄存器的值可能是不正常的,(C的一个语句没有被正确地执行完),这时回复执行同一条语句可能出现问题。那么,无论是_finally或者是_except,无论使用那种异常处理命令,出现异常后寄存器的值都可能是不正常的,这时即使另起一条新的C语句并且执行仍然有可能出现问题。这样的话异常处理其不是变成了赌汇编指令了么?
再追问一下,就是假如出现了寄存器值异常的情况,再试图进行API函数调用(断言相关的汇编指令能够正确执行)是一个明智的选择么?还是说跟编译器的好坏是相关的?