■ 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
123 [동영상 강의] 델파이 기본 교육_18.부서관리 관리자 2012.08.03 5825
122 [델파이 문법] 프로시저와 함수 #4 file 관리자 2012.08.02 6144
121 [델파이 문법] 프로시저와 함수 #3 file 관리자 2012.07.31 6475
120 [델파이 문법] 프로시저와 함수 #2 file 관리자 2012.07.27 7212
119 [동영상 강의] 델파이 기본 교육_17.인사관리(편집과차) 관리자 2012.07.25 6582
118 [델파이 문법] 프로시저와 함수 #1 file 관리자 2012.07.23 8697
117 [동영상강의] 델파이 기본 교육_16.인사관리 화면(연결과 조회) 관리자 2012.07.19 6576
116 [델파이 문법] 클래스와 객체 #21 file 관리자 2012.07.13 6769
115 3줄의 코드로 "움직이는 3D 컬러애벌레" 만들기 관리자 2012.07.12 6884
114 [동영상강의] 델파이 기본 교육_15.델파이와 DB연결과 dbExpress 관리자 2012.07.12 6854
» [델파이 문법] 클래스와 객체 #20 file 관리자 2012.07.09 5477
112 [델파이 문법] 클래스와 객체 #19 file 관리자 2012.07.06 6383
111 [동영상강의] 델파이 기본 교육_14.메모장 만들기3 (스프래쉬 화면과 리포지토리) 관리자 2012.07.06 6176
110 델파이 튜토리얼 워크샵 발표자료_3D 프로그래밍과 라이브바인딩 file 관리자 2012.07.05 5952
109 델파이 아래 버전에서 XE2로 마이그레이션시 별도의 리소스 파일이 필요 없는 경우 관리자 2012.07.05 5516
108 [동영상강의] 델파이 기본 교육_13.메모장 만들기2 관리자 2012.07.04 6980
107 [델파이 문법] 클래스와 객체 #18 file 관리자 2012.07.02 6566
106 [동영상강의] 델파이 기본 교육_12.메모장 만들기 관리자 2012.06.29 7049
105 [델파이 문법] 클래스와 객체 #17 file 관리자 2012.06.28 6528
104 [델파이 문법] 클래스와 객체 #16 file 관리자 2012.06.26 6382