在看《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.   

    is directly executed by the system,这是说系统让你的线程调用handler如果是真的异常,出现异常后寄存器的值都可能是不正常的,是这样,但如果情况不是特别严重可以弹出个错误报告重启程序什么的,再轻微点可以忽略有的异常是源代码自己甩的,来报告错误或者作为信号使用。这时就是可控的,不会寄存器的值都可能是不正常
      

  2.   

    原来是这样。原文中说:“...process may be unstable during the execution of the handler.”说得估计就是上面那种情况。
    再追问一下,就是假如出现了寄存器值异常的情况,再试图进行API函数调用(断言相关的汇编指令能够正确执行)是一个明智的选择么?还是说跟编译器的好坏是相关的?
      

  3.   

    就是说在执行handler之前系统已经保存并且重置了寄存器一类的东西,就好像线程发生切换一样