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 등의 전역변수 가 있습니다. 자세한 존재 목적은 다음에 좀더 연구해서 올리도록 하겠습니다. 그럼..
|