업데이트 내역: No.2
업데이트 시간 : 2001-10-21 02:42
업데이트: Musicwind®
업데이트 참고 사항: 형식이 수정되었습니다.
업데이트 내역: No.1
업데이트 시간: 2001-10-19 21:15
업데이트: Musicwind®
업데이트 참고 사항: 생성되었습니다.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~ ~~~~~~~~~~~~~~~~~~~~~~~
머리말: 델파이에 푹 빠진 지 3년이 넘었지만, 델파이의 도움말 문서를 읽을 때마다 여전히 많은 것을 얻어가기 때문에 델파이가 얼마나 넓은 지 한숨을 쉬지 않을 수 없습니다 ! 부끄럽지만 제가 겪은 일과 얻은 것들을 정리하고, 저처럼 오만하고 지식이 부족한 분들에게 격려의 말씀을 전하겠습니다.
1. 자동 예외란 무엇입니까? (왜 양들의 침묵이 아닌가? ;- ))
자동 예외, 즉 Slient 예외는 기본적으로 성가신 메시지 프롬프트를 유발하지 않는 예외 유형인 EAbort 를 참조합니다. 오브젝트 파스칼에서 예외 클래스 EAbort는 모든 자동 예외 클래스의 조상 클래스입니다(그리고 EAbort는 Exception을 상속합니다). EAbort를 발생시키면 가장 바깥쪽 예외 처리 모듈이 이를 가로챌 때까지 실행 모듈이 중지되지만 빨간색 중지 기호가 있는 메시지 상자는 나타나지 않습니다. 다음 코드를 참조하세요:
노력하다
ShowMessage('안녕하세요1');
EAbort.Create('중단');을 발생시킵니다.
ShowMessage('안녕하세요2');
제외하고
E: 예외 발생
showmessage('예외 발생 시');
끝;
실행 결과에는 두 개의 메시지 상자가 표시됩니다. 하나는 "Hello1"이고 다른 하나는 "On Exception"입니다. 이는 "ShowMessage('Hello2')" 문을 건너뛰고 동시에 "Abort it" 메시지 상자가 나타나지 않기 때문에 EAbort가 작동함을 보여줍니다. 이는 대화 상자가 없다는 EAbort 예외 클래스의 기능도 확인합니다. (이는 설계 중에도 마찬가지입니다.) 메시지 상자 "On Exception"은 EAbort가 일반적인 예외와 다를 수 있지만 이를 포착하기 위해 이전 Try-Except 문을 사용하는 것을 막지는 않는다는 것을 나타냅니다. .
2. 왜 EAbort를 사용합니까 ?
EAbort는 특정 상황에서 유용합니다. 예를 들어, 작업을 종료해야 하지만 사용자가 이를 인지하지 못하게 하려는 경우(기본 예외 메시지 상자를 표시하지 않기를 원하는 경우)입니다. 물론 동일한 효과를 얻으려면 일반적인 예외를 사용할 수도 있습니다(예: Try-Except 문장 패턴을 사용하고, Try 섹션에 코드를 넣고, 작업을 종료해야 하는 경우 예외를 발생시키고, 작성하지 않음) Except 섹션의 모든 코드) 그러나 이 중 어느 것도 EAbort를 사용하는 것만큼 간단하고 직접적인 것은 없습니다.
3. 더 간단한 것이 있나요? --중단 프로세스 사용
SysUtils 유닛에 정의된 프로세스인 Abort를 사용하면 EAbort를 편리하게 사용할 수 있습니다. Abort의 구현 소스 코드 보기:
절차 중단;
함수 ReturnAddr: 포인터;
asm
MOV EAX,[EBP + 4]
끝;
시작하다
ReturnAddr에서 EAbort.Create(SOperationAborted)를 발생시킵니다.
끝;
여기서 SOperationAborted는 일반적으로 "작업이 중단되었습니다"입니다.
4. 베일을 벗기다 - 구현 원칙
어쩌면 당신은 나처럼 EAbort가 왜 침묵하는지 궁금할 것입니다. Delphi는 내부적으로 EAbort에 어떤 작업을 수행했습니까? 함께 알아봅시다.
새 프로젝트를 열고 파일에서 찾기를 클릭하고 "EAbort" 키워드를 입력한 다음 디렉토리에서 검색 라디오 버튼을 선택하고 검색 디렉토리 옵션의 파일 마스크 편집 상자를 Delphi 소스 코드가 있는 디렉토리 이름으로 설정합니다(예: 내 것으로 예: D:Program FilesBorlandDelphi6Source), 하위 디렉터리 포함을 선택하는 것을 잊지 마세요. 마지막으로 "확인"을 클릭하여 검색을 시작합니다.
그 결과, 델파이 소스 코드에서 EAbort와 관련된 곳이 무려 17 곳에 달하는 것을 발견했습니다. EAbort의 두 가지 선언과 Sysutils 유닛의 일부 주석문을 제외하면 대부분의 코드가 다음과 유사하다는 것을 알았습니다.
ExceptObject가 EAbort인 경우
게다가:
그렇지 않은 경우(E는 EAbort)
등.
그들 모두는 RTTI를 기반으로 한 EAbort에 대한 특별 대우를 받았습니다. EAbort의 구현은 매우 간단하다는 것이 밝혀졌습니다!
주목할 만한 두 가지 단위는 Forms(Linux 버전은 QForms)와 AppEvnts입니다. 전자의 코드에서 질문에 대한 답을 찾는 것이 더 쉽습니다. 델파이 소스 코드를 참조하세요:
절차 Tapplication.HandleException(Sender: TObject);
시작하다
GetCapture <> 0이면 SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
ExceptObject가 Exception인 경우
시작하다
그렇지 않은 경우(ExceptObject는 EAbort임)
할당된 경우(FOnException) 다음
FOnException(발신자, 예외(ExceptObject))
또 다른
ShowException(Exception(ExceptObject));
다른 끝
SysUtils.ShowException(ExceptObject, ExceptAddr);
끝;
5. Abort , Break , Exit 의 차이점
중단(Abort), 중단(Break) 및 종료(Exit)는 다소 유사하지만 매우 다릅니다. Break는 루프 문에서 루프를 벗어나는 데 사용됩니다. Exit는 현재 실행 중인 함수 본문(또는 프로세스 본문)에서 벗어나는 데 사용됩니다. 중단을 사용하면 예외 포착 코드가 이를 포착할 때까지 하나 이상의 코드 레이어에서 벗어날 수 있습니다.
6. 자동 예외 사용자 정의
일반 예외 클래스의 하위 클래스를 선언하는 것과 마찬가지로 EAbort와 해당 하위 클래스를 상위 클래스로 만듭니다.
TMyException = Class(EAbort);
TNextException = Class(EAbort);
등.
Musicwind®@HangZhou.Zhejiang.China
2001-10-20
더 많은 기사
[ 기사 끝]