1

내가 할 노력하고있어 :C++ Builder에서 액세스 위반 예외를 처리합니까?

try{ 
    int * i = NULL; 
    *i = 3; 
}catch(Exception &Err){ 
    ShowMessage(Err.Message); 
} 

나는 생각이 액세스 위반 예외를 catch하고 오류 메시지를 표시하여이를 처리해야한다고.

는하지만 어떤 이유로 나는 간단한

액세스 위반을 대신 전체 하나의 모듈 YYY에

액세스 위반 XXX의

메시지가 표시됩니다. 주소 ZZZ에 글쓰기.

BTW, ExceptObject() 루틴은 이상한 이유로 NULL을 반환합니다.

무엇이 여기에 있습니까?

+0

"Vialotion 액세스"가 작동하는 방식이기 때문에 표시됩니다. RTL은 던져진 EAccessViolation 객체에 전체 예외 데이터를 저장하지 않습니다. ExceptObject()와 관련하여 사용중인 C++ Builder의 버전을 말하지 않았습니다. ExceptObject() 및 ExceptAddr()은 이전 버전의 C++에서 버그가있는 것으로 알려져 있습니다. –

답변

1

Mixing SEH and C++ Exceptions에 대한 MSDN 블로그 항목을 참조하십시오. 이들은 두 가지 다른 유형의 예외입니다. C++ 예외로 OS에서 생성 된 구조적 예외를 잡으려고 시도하는 것이 올바른 방법이 아닙니다. 이 비트를 this posting on not doing that으로 조절합니다.

액세스 위반을 catch하는 것이 좋은 목표 일 수 있지만 디버그 컨텍스트 내에서 수행하려는 작업은입니다. 프로덕션 코드에서 액세스 위반 (또는 기타 주요 예외)을 잡아서 처리하려고 시도하는 경우가 거의 발생하지 않습니다.

-1
try { 
    int * i = NULL; 
    *i = 3; 
} 
catch (...) { 
    // This would catch the access violation but you don't have any more 
    // information of what has gone wrong 
} 

그러나 구조적 예외 처리 (SEH)를 사용하여 모든 C++ 예외를 catch 할 수 있습니다. C++ 예외는 SEH를 기반으로하는 클래스 기반 구현 일 뿐이므로

+0

아니요 seg 오류이며 catch (...)도 catch 할 수 없습니다. – Sesh

0

표준 C++은 NULL 포인터를 역 참조하는 것이 예외를 throw한다고 지정하지 않습니다. 결과는 정의되지 않은 동작을 발생시킵니다. Windows 플랫폼에서 Windows Structured Exception Handling을 사용하면 물이 약간 흐려집니다. 이것은 일부 C++ 런타임이 이러한 예외를 C++ 예외로 변환 할 수 있다는 점을 제외하면 C++ 예외 처리와는 아무런 관련이 없습니다. 그러나 그러한 변환에 의존하는 코드는 이식성이 없습니다. EAccessViolation을 잡기 BCB5에서

1

는 작동 예컨대 : class_name을이 프로젝트에 고유 아마도 AnsiString을 (this-> 클래스 이름)로 대체 또는 생략 할 것을

#define AV_TRY { try { 

#define AV_CATCH } catch(EAccessViolation &av) {Application->MessageBox((("Access Violation caught: " + string(__FILE__) + "; " + string(__FUNC__) + "; " + IntToString(__LINE__) + "\n\n") + av.Message.c_str()).c_str(), ("Program Error in " + string(class_name.c_str())).c_str(), MB_OK);} } 

참고. 또한이 코드를 자동으로 데이터베이스에 로깅하지 않고 MessageBox를 표시하도록 전환했습니다. AV_TRY ... AV_CATCH에서 AV를 관찰 한 코드를 그냥 랩핑합니다.