C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[888] [Exception] 예외처리4 - AccessViolation이 아닌 예외의 경우 에러위치 찾기
장성호 [nasilso] 8808 읽음    2009-04-23 00:01

AccessViolation이 아닌경우 예외 발생위치 찾기



프로그램에서  AccessViolation이 발생한경우에는 에러메세지에 에러발생 주로가 나타납니다.

함수의 try - catch 한데서 발생한 에러가 아닌
Application.OnException에서 다름과 같이 AccessViolation이 아닌 에러가 발생했다면
이 에러의 발생 코드위치를 어떻게 찾을수 있을까요?

 

예외 발생 주소 가져다 주는 함수
   ; 이런 목적으로 만들어졌는지 모르겠지만 VCL에는
     예외가 발생한 위치(에러발생주소)를 return해주는 함수가 있다는 사실을 알고 계십니까?

   바로 System유닛에 있는 ExceptAddr 이라는 함수입니다.
   (System유닛은 include나 uese없이 그냥 사용하면 됩니다.)

   함수 코드는 ..

  function  ExceptAddr: Pointer;
  begin
     if  RaiseListPtr <> nil  then
      Result  := PRaiseFrame(RaiseListPtr)^.ExceptAddr    
     else
      Result  := nil;
  end;

자세한 원리는 나중에 좀더 연구해서 올리도록 하구요..
여튼 ExceptAddr이라는 함수를 이용하여 AccessViolation이 아닌경우라도 Error발생 위치를 찾을수 있습니다.

 

기타 예외 관련 함수 및 전역변수
   ; ExceptAddr 함수 외에도 예외처리 관련하여 system유닛에 Global함수들이 몇 더있습니다. 

   1. ExceptObject
       ; Application.OnException이벤트에 Sender로 넘어오는 놈입니다.
        즉 예외를 발생시킨 객체의 포인터입니다.   

  function ExceptObject: TObject;
  begin

   
if RaiseListPtr <> nil then

      Result 
:= PRaiseFrame(RaiseListPtr)^.
ExceptObject
    
else

      Result 
:= nil;

  end;

 

 2.ExceptProc , ExceptClsProc , ExceptObjProc , ExceptionClass 등의 전역변수
   가 있습니다.
   자세한 존재 목적은 다음에 좀더 연구해서 올리도록 하겠습니다.
   

그럼..


+ -

관련 글 리스트
888 [Exception] 예외처리4 - AccessViolation이 아닌 예외의 경우 에러위치 찾기 장성호 8808 2009/04/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.