■ try...except 문

예외는 try...except 문 내에서 처리됩니다. 예를 들면, 다음과 같습니다.

a1.png 

이 문에서는 Y를 Z로 나눕니다. 그러나 EZeroDivide(0으로 나누기) 예외가 발생하게 되면
HandleZeroDivide 라는 루틴을 호출합니다.

try...except 문의 문법은 다음과 같습니다.

a2.png 

여기서 statements는 세미콜론으로 구분되는 일련의 문장들이며, exceptionBlock은 다음
중 하나입니다.
   - 일련의 다른 문장들
   - 일련의 예외 핸들러들. 옵션으로 다음의 절이 따라올 수 있습니다.

a3.png 

예외 핸들러는 다음과 같은 형태를 가집니다.

a4.png 

여기서 identifier:은 옵션으로서 identifier는 유효한 식별자이고, type은 예외를 나타내는
데 사용되는 타입이며, statement는 임의의 문장입니다.

try...except 문은 try 다음에 있는 첫 statements 리스트의 문장들을 실행합니다. 예외가
발생하지 않으면 예외 블럭(exceptionBlock)은 무시되고 프로그램의 다음 부분으로 제어가
넘어갑니다.

첫번째 statements 리스트에 포함된 raise 문, 혹은 statements 리스트에서 호출된 프로시
저나 함수에 의해 첫번째 statements 리스트의 실행 중 예외가 발생하면, 예외를“처리”하
려는 시도가 일어납니다.

   - exceptionBlock의 핸들러 중 해당 예외와 일치하는 것이 있을 경우, 그중 첫 번째 핸들러로
      제어가 넘어갑니다. 핸들러에 있는 타입이 해당 예외나 그 조상일 때, 그 예외 핸들러와 예외가
      “일치”하는 것입니다.
   - 일치하는 핸들러가 없으면, else 절이 있으면 그 절의 statements로 제어가 넘어갑니다.
   - 예외 블럭이 예외 핸들러가 없는 일련의 문장들인 경우, 그 리스트의 첫 번째 문장으로 제어가
      넘어갑니다.

위 조건 중 해당하는 것이 없는 경우, 가장 최근에 진입해서 아직 빠져나가지 않은
try...except 문의 예외 블럭에서 찾기를 계속합니다. 적절한 핸들러, else 절 또는 문장 목록
이 없는 경우에는 그 다음의 가장 최근에 진입해서 아직 빠져나가지 않은 try...except 문을
검색해나가고, 이런 식으로 계속 검색해 나갑니다. 가장 외부 try...except 문에 도달해도 예
외가 처리되지 않는 경우, 프로그램이 종료됩니다.

예외가 처리될 때, 처리가 일어나는 try...except 문이 포함된 프로시저나 함수로 스택을 역
으로 추적하며, 실행될 예외 핸들러나 else 절, 문장 목록으로 제어가 전달됩니다. 이러한 과
정에서 예외가 처리되는 try...except 문에 들어간 이후의 모든 프로시저와 함수 호출은 취
소됩니다. 그런 다음, 예외 객체는 Destroy 소멸자가 호출되어 자동으로 소멸되며, 제어는
try...except 문의 다음 문장으로 전달됩니다. (Exit, Break, Continue 표준 프로시저를 호
출하면 제어가 예외 핸들러를 빠져나가게 되며, 그런 경우에도 예외 객체는 자동으로 소멸됩
니다.)

아래 예제에서, 첫 번째 예외 핸들러는 0으로 나누기 예외를 처리하고, 두 번째 예외 핸들러
는 오버플로우 예외를 처리하며, 마지막 예외 핸들러는 다른 모든 수학 예외를 처리합니다.
EMathError를 마지막에 배치한 것은, 이 클래스가 다른 두 예외 클래스의 조상이기 때문입
니다. 이 클래스를 먼저 배치할 경우 다른 두 핸들러는 어떤 경우에도 호출되지 않습니다.

a5.png 

예외 핸들러는 예외 클래스의 이름 앞에 식별자를 지정할 수 있습니다. 이는 식별자가
on...do에 뒤의 문장을 실행하는 동안 예외 객체를 나타내는 식별자를 선언합니다. 이 식별
자의 유효 범위(scope)는 해당 문장으로 제한됩니다. 예를 들면, 다음과 같습니다.

a6.png 

예외 블록에 else 절이 있는 경우, else 절은 해당 블럭의 예외 핸들러들에 의해 처리되지 않
은 예외를 처리합니다. 예를 들면, 다음과 같습니다.

a8.png 

여기서 else 절은 EMathError가 아닌 모든 예외를 처리합니다.
예외 핸들러가 없이 문장 리스트로만 구성된 예외 블럭은 모든 예외를 처리합니다. 예를 들
면, 다음과 같습니다.

a9.png 

여기서 HandleException 루틴은 try와 except 사이의 문을 실행한 결과로 발생하는 모든
예외를 처리합니다.
번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 15433
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13961
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 16499
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 22054
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 23268
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 18923
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 39253
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 174698
50 델파이 코드 주석 추가 및 문서화 방안 험프리 2019.05.30 866
49 1PASSWORD: 델파이로 개발된 BEST 패스워드 관리 프로그램 관리자 2020.12.07 853
48 델파이에서 아이콘 폰트 사용하기 험프리 2019.12.12 831
47 [추가된 문법 정리] - 클래스 필드(Class Field):델파이 2007 추가 관리자 2016.06.03 828
46 [무료 툴] 델파이 JSON 데이터 자동 연동 프로그램 file 관리자 2020.07.20 807
45 [고객사례-게임, 델파이] 오목게임 관리자 2018.10.23 799
44 [고객사례-게임, 델파이] Rise of Legions 관리자 2019.11.08 794
43 [고객 사례- 의료, 델파이] COVID-19 - 검사 결과 실시간 확인 앱 관리자 2020.03.25 788
42 델파이 RTL: 새로운 제네릭 컬렉션 vs 기존 클래식 컬렉션 험프리 2020.01.06 777
41 파이어닥(FireDAC)으로 IBLite 연결 시 "unavaliable database." 오류 발생에 대한 대응 file Humphery 2015.05.15 768
40 [DelphiCon 요약] High DPI 고해상도를 VCL에서 활용하기 (Leveraging High DPI in VCL Applications) 관리자 2021.01.13 767
39 1차 공개 중고생 강의용 앱 소스 및 메뉴얼입니다. file 쭈니아빠 2016.07.16 762
38 델파이 코드 정적 분석기 V2.4 출시 및 무료 다운로드 관리자 2021.05.25 744
37 델파이로 3D 크레딧 스크롤 구현하기(소스제공) file 험프리 2018.05.09 733
36 [UX Summit 요약] 윈도우10에 멋진 플루언트UI 룩앤필을 델파이로 구현하기 #2 (Giving your Apps the Fluent UI Look and Feel with Delphi #2) 관리자 2021.03.02 726
35 리팩토링 3-메소드 추출 file 김원경 2017.02.24 722
34 [DelphiCon 요약] 델파이로 함수형 프로그래밍하기 (Functional Programming With Delphi) 관리자 2020.12.29 710
33 [고객사례-유틸리티, 델파이] 녹음기 앱 - Voice Recorder 관리자 2019.12.10 686
32 [10.4 시드니 신기능] 언어 서버 프로토콜 (LSP, Language Server Protocol) 관리자 2020.06.04 676
31 [델파이 샘플 코드] 안드로이드, iOS, OSX, 윈도우, 리눅스, HTML5 관리자 2019.11.13 674