嵌套__try ...__ except子句,这有效吗?

时间:2019-05-23 21:00:35

标签: c++ try-catch seh

我正在处理一个函数和一个子函数,该子函数在函数内被调用。两者都有一个__try .. __except子句,我想看看在函数情况下的一般异常处理,在子函数情况下的特殊处理,换句话说:

int function(){
__try{
  do_something();
  return subfunction();
  } __except {
  show("general exception");
  }

int subfunction(){
  __try{
    return do_something_else();
  } __except {
    show("specific case");
  }

在这种情况下:
do_something()出错时,我会看到“一般异常”。
do_something_else()出错时,我还会看到“一般异常”,这不是我想要的。

我想要的是:
do_something()出错时,我想看到“一般异常。
do_something_else()出错时,我想查看“特定情况”。

有人知道怎么做吗?
预先感谢

3 个答案:

答案 0 :(得分:1)

#include <iostream>
#include <Windows.h>

int do_something_else()
{
    *(reinterpret_cast<int*>(0)) = 1;
    return 0;
}

int do_something()
{
    return 0;
}

int subfunction();

int32_t ReportCrash(LPEXCEPTION_POINTERS ExceptionInfo) //exception and context pointers are hrere
{
    return EXCEPTION_EXECUTE_HANDLER;
}

int function()
{
    __try 
    {
        do_something();
        return subfunction();
    }
    __except (ReportCrash(GetExceptionInformation()))
    {
        std::cout << ("general exception");
    }
    return 0;
}

int subfunction()
{
    __try 
    {
        return do_something_else();
    }
    __except (ReportCrash(GetExceptionInformation()))
    {
        std::cout << ("specific case");
    }
    return 0;
}

int main()
{
    std::cout << "Hello World!\n"; 

    function();
}

详细信息为here

答案 1 :(得分:1)

您可以使用RaiseException。

有关更多详细信息,请参见Using Structured Exception Handling (SEH)

#define SUBCODE 0x1000

int Filter(LPEXCEPTION_POINTERS exceptionPointers,DWORD& code) {
  code = exceptionPointers->ExceptionRecord->ExceptionCode;
  return EXCEPTION_EXECUTE_HANDLER;
}

int function(){
  DWORD code;
  __try{
      do_something();
      return subfunction();
    } __except ( Filter( GetExceptionInformation(), code )  ){  
      if (code == SUBCODE) {
        show("specific case");      
      } else {
        show("generic code");
      }
    }
}

int subfunction(){
  __try{
    return do_something_else();
  } __except (EXCEPTION_EXECUTE_HANDLER){
    RaiseException( SUBCODE , 0, 0 , NULL );
  }
}

答案 2 :(得分:0)

您编写的代码无法编译。代替:

__except { ... }

您需要:

__except (EXCEPTION_EXECUTE_HANDLER) { ... }

然后按预期运行。

Live demo