■ 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 17870
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 16233
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 18878
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 24465
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 25841
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 21204
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 41794
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 177093
123 윈도우 버전 점유율 변화: 2009년부터 2019년 현재까지! file 관리자 2019.11.18 390
122 [발표자료] 20170623 최신OS와 멀티플랫폼 개발 전략 with RAD Studio [2] 관리자 2017.06.26 390
121 [베를린 U2] 퀵에디트(Quick Edit) 메뉴 사용하기 (1분 동영상) 험프리 2016.11.15 390
120 [다시보기] 소개합니다! FmxLinux - 델파이 파이어몽키 앱을 리눅스용으로 배포하기 관리자 2019.07.17 389
119 [발표자료] 20191017 실전 사례로 살펴보는 소프트웨어 현대화 전략 file 관리자 2019.10.23 388
118 [10.3 리오][업데이트 2] 멋지게 업그레이드된 VCL 품질 관리자 2019.09.10 387
117 [고객 사례- 솔루션, 델파이] AlignMix - 시각화된 세일즈 관리 도구 관리자 2020.05.12 386
116 [10.2 도쿄][릴리즈2] FireMonkey 퀵에디트로 주요 속성을 시각적으로 빠르게 설정할 수 있습니다. file 험프리 2017.12.13 386
115 버전별 업데이트된 주요 기능들 (C++빌더6 / 델파이7부터 최신 버전까지!) 관리자 2021.01.29 384
114 이 달의 기술자료 - 2020년 12월 험프리 2020.11.26 381
113 이 달의 기술자료 - 2019년 11월 file 험프리 2019.10.25 381
112 [엠바카데로 Feature Friday]10.3.1에서의 iPhone X, iPad Pro 해상도 지원 관리자 2019.03.21 381
111 이 달의 기술자료 - 2019년 10월 험프리 2019.09.27 380
110 [10.2 도쿄][릴리즈3] CMake 커맨드 라인 지원 관리자 2018.03.30 380
109 [발표자료] 20171117 델파이/C++빌더 제조/제어 개발 세미나 관리자 2017.11.20 380
108 MS와 엠바카데로 기술팀이 생각하는 윈도우 애플리케이션의 방향 관리자 2020.01.07 379
107 InstallAware - VCL 애플리케이션을 윈도우용 설치 파일로 생성 file 관리자 2020.08.28 378
106 [고객사례-유틸리티, 델파이] SyncBackPro - 데이터 백업/동기화 솔루션 관리자 2020.02.04 378
105 '눈에 확 띄는' 리눅스 앱을 만들고 싶다면 - Amakrits 스타일 관리자 2019.09.09 377
104 이 달의 기술자료 - 2020년 08월 험프리 2020.07.30 374