이런 문은 여러 개의 Except 문을 다중 처리하는 방법이다. try...out 문을 중첩하는 방법을 예제를 통해 알아보자.
deftest():n=int(input('테스트할 문이 3개 있습니다. (1/2/3)을 선택하십시오:')) ifn==1: #keyError 예외 my_dict={'dotcpp':123}print ( my_dict['dot'])elifn==2:#IndexError 예외 my_list=[1,2,3,4,5]print(my_list[100])elifn==3:#NameError 예외 print('존재하지 않는 변수 dotcpp:',dotcpp)try:try:try:test() ExceptKeyError:print('KeyError 예외') ExceptIndexError:print('IndexError 예외') ExceptNameError:print('NameError 예외')
각각 1/2/3을 테스트한 결과 출력 결과는 다음과 같습니다.
테스트할 문이 3개 있습니다. 선택하세요(1/2/3): 1KeyError 예외 테스트할 문이 3개 있습니다. 선택하세요(1/2/3): 2IndexError 예외 테스트할 문이 3개 있습니다. 선택하세요. (1/ 2/3): 3NameError 예외
이 예에서는 먼저 정의된 함수에 판단 n을 입력한 다음 n 값을 기준으로 세 가지 예외 상황을 제공하고 마지막에 세 개의 try..out 문을 중첩합니다. test() 문은 세 가지 수준의 판단을 거칩니다.
완전한 예외 처리 메커니즘은 finally 문과 분리될 수 없습니다. 이 문의 기능은 프로그램에서 예외가 발생하는지 여부에 관계없이 finally 문 아래의 코드가 실행된다는 것입니다.
시도:block제외[유형 오류]:deal1finally:deal2
예제를 통해 이 구조를 살펴보겠습니다.
deftest():n=int(input('정수를 입력하세요:'))print(n)try:test() ExceptKeyError:print('KeyError 예외')finally:print('최종적으로 명령문이 실행되었습니다.')
출력을 보려면 각각 6과 dotcpp를 입력해 보겠습니다.
정수를 입력하십시오: 55finally 명령문이 실행되었습니다 정수를 입력하십시오: dotcppfinally 명령문이 실행되었습니다. Traceback(mostrecentcalllast):FileC:/Users/test.py,line5,in<module>test()FileC:/Users/test. py, line2,intestn=int(input('정수를 입력하세요:'))ValueError:validliteralforint()withbase10:'dotcpp'
이 예에서 우리는 프로그램에서 예외가 발생했는지 여부에 관계없이 finally 문이 실행된다는 것을 알 수 있습니다.
위에서 학습한 finally 문은 해당 문에서 예외가 발생했는지 여부와 상관없이 실행되는 문입니다. 구문 구조는 다음과 같습니다.
시도:블록제외[유형 오류]:deal1else:deal2
아래 예를 살펴보겠습니다.
deftest():n=int(input('정수를 입력하세요:'))print('입력 값은 다음과 같습니다:',n)try:test() ExceptValueError:print('ValueError 예외')else:print(' 현재 프로그램에서 예외가 발생하지 않았습니다.')
출력은 다음과 같습니다
정수를 입력하십시오: 5. 입력 값은: 5. 현재 프로그램에는 예외가 없습니다.
dotcpp 값을 입력하면
정수를 입력하십시오: dotcppValueError 예외
프로그램이 비정상일 때는 else 문이 실행되지 않는 것을 알 수 있는데, 이러한 문을 구별하는 것은 예제를 통해 어렵지 않게 연습할 수 있습니다.