■ 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 22591
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 21024
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 23082
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 28881
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 30050
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 25397
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 46348
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 182316
1397 N 윈도우와 맥 개발 시작을 위한 파이어몽키 코스북: 무료 다운로드 제공(385페이지) 관리자 2013.04.05 152367
1396 ComPort(시리얼 통신) 컴포넌트 설치안내 [11] file 험프리 2013.12.04 112780
1395 [REST API] REST 기반 파일 업로드와 다운로드 구현하기 험프리 2020.08.31 84738
1394 델파이 튜토리얼 자습서 이용 안내 관리자 2014.09.01 71988
1393 이 달의 기술자료 - 2014년 11월 험프리 2014.10.13 54176
1392 이 달의 기술자료 - 2014년 6월 file 험프리 2014.06.05 50405
1391 Find the O/S Language Type c2design 2014.07.30 48421
1390 RAD Studio Resource Center 박병일 2012.01.26 46645
1389 CD-ROM 열고 닫기 박병일 2011.12.22 44787
1388 [Android] 폰번호 가져오기 [1] 타락천사 2014.09.05 38644
1387 이 달의 기술자료 - 2014년 12월 file 험프리 2014.11.26 32514
1386 RAD Studio XE6 Update1 발표 [1] Humphery 2014.06.20 29499
1385 델파이XE2 파이어몽키 기반 아이폰앱 개발에서 제스춰를 인식시키는 방법 박병일 2012.01.25 23342
1384 [10.4 시드니 신기능] 새로운 VCL TEdgeBrowser 컴포넌트 험프리 2020.05.18 23197