![]() |
|
||||||||
경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지 |
|
RuntimeError217.jpg
9.2KB
제 생각엔... 아무래도 빌더님이 잘못 알고 계신 것 같은데요.
먼저, 위에 인용하신 영문 부분은 처음 보는데, 제가 쓴 위 본문은 VCL의 예외처리 루틴을 다 추적해본 결과 내린 결론입니다. (저는 14년 전에 이 사이트를 처음 열 때부터, 어디서 배우거나 줏어들은 지식인 경우 반드시 출처를 밝히고 있습니다) SysUtils가 예외와 전혀 무관하다고 하셨는데, 전혀 그렇지 않습니다. SysUtils 유닛은 VCL의 통상적인 예외 처리 루틴이 대부분 들어있는 유닛인데요. VCL의 기본 예외처리 루틴들이 모두 이 SysUtils에 있고, Exception 클래스를 비롯한 많은 예외 클래스들도 다 여기에 정의되어 있죠. 애플리케이션 코드에서 명시적으로 예외가 처리되지 못하는 경우에 이 SysUtils의 예외처리 루틴으로 넘어오게 되어 있습니다. 더 정확하게 말하면, 말씀하신 System 유닛에서 예외 처리가 시작되기는 하지만, 실제로는 SysUtils로 넘어오게 됩니다. 그렇게 되는 이유는... System의 실제 예외 처리 루틴은 ExceptProc 함수 포인터가 가리키는 루틴을 호출하게 되는데요. 이 ExceptProc 루틴은 초기화가 되어 있지 않아 System 유닛 레벨에서는 nil 값인데요. SysUtils가 initialize될 때 SysUtils의 ExceptHandler 루틴을 가리키게 됩니다. 이후로 SysUtils의 ExceptHandler 루틴은 SysUtils의 여러 예외 처리 루틴들을 거치면서 예외를 실질적으로 처리합니다. 개발자 코드에서 예외처리를 하지 않았을 때 나타나는 예외 메시지박스도 여기에 포함됩니다. 다시 정리하면, 개발자 코드에서 핸들링되지 않은 예외는, SysUtils 유닛이 initialize된 상태에서는 아래와 같은 순서로 처리가 되죠. 1. System 유닛의 _ExceptionHandler 루틴 2. System 유닛의 ExceptProc 함수 포인터 3. SysUtils의 ExceptHandler 루틴 4. SysUtils의 ShowException 루틴 5. SysUtils의 ExceptionErrorMessage 루틴 및 MessageBox 에러메시지 혹은 콘솔에러 그런데, SysUtils의 initialize가 이루어지지 않은 상태에서, 즉 SysUtils의 루틴들이 미처 로드되기 전에 예외가 발생하면, System 유닛의 ExceptProc 함수 포인터가 nil인 상태이므로, 이런 정상적인 예외처리가 이루어지지 못하게 됩니다. System 유닛의 ExceptProc 함수 포인터가 nil인 경우에는 메시지박스로 "Runtime error 217 at..." 메시지를 뿌린 후 Halt 하게 되어 있습니다. 더 자세하게는, 217이라는 명시적인 숫자 상수값 에러 코드가 어셈블리 코드에 박혀있고, 이 에러코드값을 가지고 "Runtime error ??? at..." 메시지텍스트와 조합해서 메시지를 뿌리는 코드도 나옵니다. "Runtime error ??? at..." 메시지는 System 유닛의 runErrMsg이라는 문자 배열 변수로 저장되어 있습니다. 이런 코드는 System 유닛의 _ExceptionHandler 루틴의 어셈블리 코드 부분을 보시면 확인하실 수 있습니다. (조금 복잡하게 호출되지만 어쨌든 제가 설명한 이런 과정으로 호출됩니다) 위 본문에서는 제가 간략하게만 설명했습니다만, SysUtils와 System 유닛을 다시 분석해봐도 제가 쓴 내용이 맞는 것 같은데요. ^^;; 관련 글 리스트
|
Copyright © 1999-2015, borlandforum.com. All right reserved. |
위와 같이 Delphi FAQ 사이트에 누군가가 올린 글을 근거로 해서 "Runtime error 217"의 원인이 SysUtils 유닛이 초기화되기 전의 시점에서 뭔가 예외가 발생해서 라는 취지로 글을 올린 거 같은데....
"Runtime error 217"의 원인은 SysUtils 유닛의 초기화(Initialization 섹션)와 관련이 없는 겁니다.