이 이상은 저 이상이 아니다(계속)

전재 는 출처 를 밝혀 주십시오
작자
이전 글은 SEH에 관한 블로그를 써서 seh와 c++ try/catch의 통합이나 혼합 사용을 실현해야 한다고 말했습니다.vc 또는 vs 설정 방법을 통해 여러 가지 결점을 처리하기 때문이다(윗글 참조).
 
아래의 모든 코드는 vs 2005에서 테스트합니다.
 
명확하게 말하자면,seh는 윈도우즈 특유의 것이기 때문에 이식성이 없다.
윈도우즈 SEH 포착 코드 블록은try/__except 블록, 다음 코드는 이 블록을 사용하는 방법을 보여 줍니다.
__try
{
  int *p = NULL;
  *p = 10;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
  cout << "seh exception happened" << endl;
}


在__try 블록에서 불법 메모리 주소에 값을 부여합니다. 이것은 전형적인seh이상이기 때문에 프로그램의 결과는 출력됩니다:seh exception happened
 
__except의 매개 변수는 비교적 재미있다. 왜냐하면 이것은 표현식일 수 있기 때문이다. 이렇게 처리하는 것은 유연성을 가져온다.当__try 블록에 이상이 발생하면except의 표현식 (이상이 발생했을 때 except 블록의 문장은 실행되지 않을 수도 있지만 표현식은 반드시 실행될 것이다.) 이 표현식의 실행 결과는 이상이 어떻게 처리되는지를 결정한다.표현식이 실행된 결과는 일반적으로 세 가지가 있는데 msdn에서 다음과 같이 말한다.
EXCEPTION_CONTINUE_EXECUTION (–1)   Exception is dismissed. Continue execution at the point where the exception occurred. 

 

EXCEPTION_CONTINUE_SEARCH (0)   Exception is not recognized. Continue to search up the stack for a handler, first for containing try-except statements, then for handlers with the next highest precedence. 

 

EXCEPTION_EXECUTE_HANDLER (1)   Exception is recognized. Transfer control to the exception handler by executing the __except compound statement, then continue execution after the __except block. 

뜻이 뚜렷하다except 표현식의 결과는 EXCEPTION 입니다.EXECUTE_HANDLER 시에만 수행except의 문장.
EXCEPTION_EXECUTE_HANDLER은 이상이 식별될 수 있음을 표시하기 때문에 에 맡깁니다except에서 처리합니다.위의 코드 세그먼트처럼except의 매개변수는 EXCEPTION 입니다.EXECUTE_HANDLER, 그래서 "seh exception happened"가 출력됩니다.
 
실제 프로젝트에서 응용하는 것은 약간 복잡할 수 있지만, 왕왕 이렇게 직접 에게 주지 않는다except의 매개 변수 값을 설정합니다. 만약에 코드에 이상이 발생하면 우리는 어떤 이상이 발생했는지 알고 싶을 것입니다. 즉, 이런 이상을 식별하려면 필터 함수를 써야 합니다. ( except의 매개 변수는 표현식이기 때문에 함수 호출이 가능합니다) 우리가 식별할 수 있는 이상을 필터해서 EXCEPTION 이 되도록 해야 합니다.EXECUTE_HANDLER -except에서 처리해.코드는 다음과 같습니다.
 
int FilterFunc(DWORD exCode)
{
 if (exCode == EXCEPTION_ACCESS_VIOLATION)//    
 {
  cout << "EXCEPTION_ACCESS_VIOLATION" << endl;
  return EXCEPTION_EXECUTE_HANDLER;
 }
 else if (exCode == EXCEPTION_STACK_OVERFLOW)//    
 {
  cout << "EXCEPTION_STACK_OVERFLOW" << endl;
  return EXCEPTION_EXECUTE_HANDLER;
 }
 else if (exCode == EXCEPTION_INT_DIVIDE_BY_ZERO)//   0
 {
  cout << "EXCEPTION_INT_DIVIDE_BY_ZERO" << endl;
  return EXCEPTION_EXECUTE_HANDLER;
 }
 else
 {
  cout << "unknown exception" << endl;
  return EXCEPTION_CONTINUE_SEARCH;
 }
}

그리고 이렇게 사용할 수 있다.
__try
 {
   int *p = NULL;
   *p = 10;
 }
 __except(FilterFunc(GetExceptionCode()))
 {
   cout << "seh exception happened" << endl;
 }

출력: EXCEPTIONACCESS_VIOLATION seh exception happened
GetExceptionCode 함수는 win32가 정의한 매크로라는 것만 알고 이상 코드를 되돌려주면 됩니다.
 
또한 FilterFunc에서 다음과 같은 상세 추적 예외를 보완할 수도 있습니다.
int FilterFunc(DWORD exCode, char *fileName, int nLine, char *time)
{
 if (exCode == EXCEPTION_ACCESS_VIOLATION)//    
 {
  cout << "EXCEPTION_ACCESS_VIOLATION" << endl;
  cout << "at " << fileName << ",line: " << nLine << ",time: " << time <<endl;
  return EXCEPTION_EXECUTE_HANDLER;
 }
 else if (exCode == EXCEPTION_STACK_OVERFLOW)//    
 {
  cout << "EXCEPTION_STACK_OVERFLOW" << endl;
  cout << "at " << fileName << ",line: " << nLine << ",time: " << time <<endl;
  return EXCEPTION_EXECUTE_HANDLER;
 }
 else if (exCode == EXCEPTION_INT_DIVIDE_BY_ZERO)//   0
 {
  cout << "EXCEPTION_INT_DIVIDE_BY_ZERO" << endl;
  cout << "at " << fileName << ",line: " << nLine << ",time: " << time <<endl;
  return EXCEPTION_EXECUTE_HANDLER;
 }
 else
 {
  cout << "unknown exception" << endl;
  cout << "at " << fileName << ",line: " << nLine << ",time: " << time <<endl;
  return EXCEPTION_CONTINUE_SEARCH;
 }
}

 
그런 다음 다음과 같이 호출합니다.
__try
{
  int *p = NULL;
  *p = 10;
}
__except(FilterFunc(GetExceptionCode(), __FILE__, __LINE__, __TIME__))
{
   cout << "seh exception happened" << endl;
}

결과 출력: EXCEPTIONACCESS_VIOLATION at d:\study\test\exceptiontest\exceptiontest\exceptiontest.cpp,line: 36,time: 14 :34:50 seh exception happened
자, 앞으로 우리 코드에서try/catch로throw의 이상을 포착할 수 있습니다.try/__except 포획seh이상.각자 그 직무를 담당하다.
마지막으로 마이크로소프트는 우리가 c에서 사용하기를 바란다try/__except, c++ 또는try/catch를 사용하십시오. 전자를 사용하지 마십시오.원인은 다방면이어서 더 이상 말하지 않겠다.
 
만약 이 필요하지 않다면 한 가지 문제를 생각해라try/__except, 어떻게 c++ 코드에서 SEH를 사용합니까?
다음 문장을 기다리시오..

좋은 웹페이지 즐겨찾기