English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 문서에서는 Python 프로그램에서 try, except, finally 문을 사용하여 예외를 처리하는 방법을 배울 것입니다. 이는 Python으로 깨끗하고 읽기 쉬운 코드를 작성하도록 격려할 것입니다.
Python에는 많은내장 예외 일부 오류가 발생하면, 프로그램이 오류를 출력하도록 강제합니다.
이러한 예외가 발생하면, 현재 프로세스가 중단되고, 처리될 때까지 호출 프로세스로 전달됩니다. 처리하지 않으면, 우리의 프로그램이 충돌합니다.
예를 들어, 함수 A가 함수 B를 호출하고, B가 함수 C를 호출하면 C에서 예외가 발생합니다. C에서 예외를 처리하지 않으면, 이 예외는 B로 전달되고, 그 다음 A로 전달됩니다.
처리하지 않으면, 오류 메시지가 표시되고, 우리의 프로그램이 예기치 않게 중단됩니다.
Python에서는 try 문을 사용하여 예외를 처리할 수 있습니다.
예외를 일으킬 수 있는 중요한 작업을 try 문 구문에 넣고, 예외를 처리하는 코드를 except 문 구문에 작성합니다.
캡처 예외 후, 우리는 어떤 작업을 수행할지 우리 스스로 결정합니다. 이는 간단한 예제입니다.
# 모듈 sys를 가져와 예외 타입을 얻기 위해 import sys randomList = ['a', 0, 2] for entry in randomList: try: print("The entry is", entry) r = 1/int(entry) break except: print("Oops!", sys.exc_info()[0], "occurred.") print("Next entry.") print() print("The reciprocal of", entry, "is", r)
Output result
The entry is a Oops! <class 'ValueError'> occurred. Next entry. The entry is 0 Oops! <class 'ZeroDivisionError'> occurred. Next entry. The entry is 2 The reciprocal of 2 is 0.5
이 프로그램에서는 사용자가 유효한 역수를 입력할 때까지 반복적으로 실행합니다. 예외를 일으킬 수 있는 부분은 try 블록에 넣습니다.
예외가 발생하지 않으면 except 블록 이외의 내용을 건너뛰고 일반 흐름을 계속합니다. 하지만 예외가 발생하면 except 블록에 잡힙니다.
여기서 sys 모듈의 exinfo() 함수를 사용하여 예외 이름을 출력하고, 사용자에게 다시 시도하도록 요청합니다. 값 ‘a’와 ‘1.3‘0’은 ValueError를, ‘0’은 ZeroDivisionError를 일으킵니다.
위의 예제에서 except 문에 어떤 예외도 언급하지 않았습니다.
이것은 좋은 프로그래밍 습관이 아닙니다. 모든 예외를 잡고 동일한 방식으로 처리합니다. except 문이 잡을 예외를 지정할 수 있습니다.
한 개의 try 문은 여러 개의 except 문을 가질 수 있으며, 각각 다른 방식으로 처리할 수 있지만, 예외가 발생할 때는 단 하나의 except 문만 실행됩니다.
except 문에서 여러异常을 지정할 수 있습니다. 아래는 가상 코드 예제입니다.
try: # 특정 코드 실행 pass except ValueError: # ValueError 예외 처리 pass except (TypeError, ZeroDivisionError): # 여러异常 처리 # TypeError 과 ZeroDivisionError 예외 pass except: # 모든 다른 예외 처리 pass
파이썬 프로그래밍에서, 예외는 실행 중에 해당 오류가 발생할 때 투기되며, raise 키워드를 사용하여 강제로 예외를 투기할 수 있습니다.
이렇게 값을 예외에 전달하여 예외가 발생하는 이유를 설명할 수 있습니다.
>>> raise KeyboardInterrupt Traceback (most recent call last): ... KeyboardInterrupt >>> raise MemoryError("This is an argument") Traceback (most recent call last): ... MemoryError: This is an argument >>> try: ... a = int(input("정수를 입력하세요: ")) ... if a <= 0: ... raise ValueError("이는 정수가 아닙니다!") ... except ValueError as ve: ... print(ve) ... 정수를 입력하세요: -2 이는 정수가 아닙니다!
파이썬의 try 문은 선택적인 finally 문구를 가질 수 있습니다. 이 문구는 어떤 경우에도 실행되며, 일반적으로 외부 자원을 해제하는 데 사용됩니다.
예를 들어, 원격 데이터 센터에 네트워크를 통해 연결할 수 있거나, 파일을 사용하거나 그래픽 사용자 인터페이스(GUI)를 사용할 수 있습니다.
이러한 모든 경우에, 자원이 성공적으로 처리되었든 아니든, 우리는 이를 해제해야 합니다. 이러한 작업(파일 닫기, GUI 또는 네트워크와의 연결 해제)은 finally 문구에서 실행되어 실행을 보장합니다.
이는 다음과 같습니다.파일操作이를 설명하기 위해 예제를 들어보겠습니다.
try: f = open("test.txt", encoding = 'utf-8) # 파일操作 실행 finally: f.close()
이러한 유형의 구조는 예외가 발생하더라도 파일을 닫는다.