■ 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 15414
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13960
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 16496
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 22048
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 23267
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 18921
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 39245
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 174696
110 Developer Direct LIVE! 모바일 썸머 스쿨!! 관리자 2013.07.06 2954
109 [기술백서] 모바일로 가면서 개발자가 하게 되는 실수 TOP5 (한글) 관리자 2013.07.06 4318
108 TListView iOS 샘플 제공 관리자 2013.06.28 4024
107 아이폰, 아이패드, 아이팟 앱 개발을 위한 파이어몽키 용 TMS 컴포넌트가 출시되었습니다. 관리자 2013.06.04 3786
106 IOS 앱을 개발하여 App Store에 등록하는 방법 관리자 2013.05.20 5405
105 델파이XE4로 아이폰, 아이패드, 윈32, 윈64, 맥OS X 단일 소스코드 베이스로 2분만에 개발 관리자 2013.05.13 5602
104 Delphi XE4에서 iOS 개발 환경 구축시 유의 할점. c2design 2013.05.11 5384
103 [웹세미나 안내] 델파이를 활용한 멀티-디바이스 앱 개발 관리자 2013.03.29 4636
102 멀티-티어 작업을 더욱 쉽게 만들어주는 Class Helper 관리자 2013.03.26 5000
101 델파이로 간단하게 슬라이드 효과를 적용한 iOS앱 만들기 관리자 2013.03.26 4957
100 [델파이 문법] 데이터 타입, 변수 및 상수 #4 file 관리자 2013.02.19 6374
99 [델파이 문법] 데이터 타입, 변수 및 상수 #3 file 관리자 2013.02.13 6736
98 [델파이 문법] 데이터 타입, 변수 및 상수 #2 file 관리자 2013.02.04 8231
97 [델파이 문법] 데이터 타입, 변수 및 상수 #1 관리자 2012.12.25 6980
96 [델파이 문법] 문법 요소 #15 file 관리자 2012.12.25 5392
95 델파이/C++빌더/RAD Studio XE3 업데이트1 다운로드 및 보완사항 리스트 관리자 2012.12.21 5193
94 [델파이 문법] 문법 요소 #14 file 관리자 2012.12.17 5358
93 [웹 세미나] RAD 따라잡기: 윈도우8 스타일 관리자 2012.11.27 4488
92 CodeRage7 : '델파이' 다시보기 관리자 2012.11.24 5261
91 [델파이 문법] 문법 요소 #13 file 관리자 2012.11.20 6108