산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> python

파이썬 예외 처리 마스터하기: 종합 가이드

파이썬은 파이썬 프로그램에서 예상치 못한 오류를 처리하고 디버깅 기능을 추가하기 위한 두 가지 중요한 기능을 제공합니다.

표준 예외 목록

번호 예외 이름 및 설명
1

Exception

모든 예외의 기본 클래스

2

StopIteration

이터레이터의 next() 메서드가 어떤 객체도 가리키지 않을 때 발생

3

SystemExit

sys.exit() 함수에 의해 발생

4

StandardError

StopIteration과 SystemExit을 제외한 모든 내장 예외의 기본 클래스

5

ArithmeticError

숫자 계산에서 발생하는 모든 오류의 기본 클래스

6

OverflowError

계산이 숫자 유형의 최대 한도를 초과할 때 발생

7

FloatingPointError

부동소수점 계산이 실패할 때 발생

8

ZeroDivisionError

모든 숫자 유형에서 0으로 나누기 또는 모듈로 연산 시 발생

9

AssertionError

assert 문 실패 시 발생

10

AttributeError

속성 참조 또는 할당 실패 시 발생

11

EOFError

raw_input() 또는 input() 함수에서 입력이 없고 파일 끝에 도달했을 때 발생

12

ImportError

import 문 실패 시 발생

13

KeyboardInterrupt

사용자가 프로그램 실행을 중단할 때 발생(일반적으로 Ctrl+C)

14

LookupError

모든 조회 오류의 기본 클래스

15

IndexError

시퀀스에서 인덱스를 찾을 수 없을 때 발생

16

KeyError

지정된 키가 딕셔너리에 없을 때 발생

17

NameError

식별자가 로컬 또는 전역 네임스페이스에서 발견되지 않을 때 발생

18

UnboundLocalError

함수나 메서드에서 로컬 변수에 접근하려고 하지만 값이 할당되지 않았을 때 발생

19

EnvironmentError

파이썬 환경 외부에서 발생하는 모든 예외의 기본 클래스

20

IOError

입력/출력 연산 실패 시 발생(예: print 문이나 존재하지 않는 파일을 열 때 open() 함수)

21

IOError

운영 체제 관련 오류 시 발생

22

SyntaxError

파이썬 문법 오류 시 발생

23

IndentationError

들여쓰기가 올바르게 지정되지 않았을 때 발생

24

SystemError

인터프리터가 내부 문제를 발견했지만 이 오류가 발생해도 파이썬 인터프리터는 종료되지 않음

25

SystemExit

sys.exit() 함수를 사용하여 파이썬 인터프리터가 종료될 때 발생. 코드에서 처리하지 않으면 인터프리터가 종료됨

26

TypeError

지정된 데이터 유형에 유효하지 않은 연산이나 함수가 시도될 때 발생

27

ValueError

내장 함수의 데이터 유형에 유효한 타입의 인수가 있지만 인수 값이 유효하지 않을 때 발생

28

RuntimeError

생성된 오류가 어떤 범주에도 속하지 않을 때 발생

29

NotImplementedError

상속받은 클래스에서 구현해야 하는 추상 메서드가 실제로 구현되지 않았을 때 발생

파이썬 어설션

어설션은 프로그램 테스트가 완료되면 켜거나 끌 수 있는 일종의 건전성 검사입니다.

어설션을 이해하는 가장 쉬운 방법은 raise-if 문(더 정확히는 raise-if-not 문)과 유사하다고 생각하는 것입니다. 표현식을 테스트하고 결과가 false이면 예외가 발생합니다.

어설션은 파이썬 1.5 버전에 도입된 최신 키워드인 assert 문으로 수행됩니다.

프로그래머는 종종 함수 시작 부분에 어설션을 배치하여 유효한 입력을 확인하고, 함수 호출 후에 유효한 출력을 확인합니다.

assert 문

assert 문을 만나면 파이썬은 동반 표현식을 평가하며, 이는 true이길 바랍니다. 표현식이 false이면 파이썬은 AssertionError 예외를 발생시킵니다.

assert의 구문은 다음과 같습니다.

assert Expression[, Arguments]

어설션이 실패하면 파이썬은 ArgumentExpression을 AssertionError의 인수로 사용합니다. AssertionError 예외는 try-except 문을 사용하여 다른 예외처럼 잡고 처리할 수 있지만, 처리하지 않으면 프로그램이 종료되고 트레이스백이 출력됩니다.

예제

켈빈 온도를 화씨 온도로 변환하는 함수입니다. 0도 켈빈이 최저 온도이므로, 음수 온도가 들어오면 함수가 종료됩니다.

#!/usr/bin/python
def KelvinToFahrenheit(Temperature):
    assert (Temperature >= 0), "Colder than absolute zero!"
    return ((Temperature - 273) * 1.8) + 32

print(KelvinToFahrenheit(273))
print(int(KelvinToFahrenheit(505.78)))
print(KelvinToFahrenheit(-5))

위 코드를 실행하면 다음과 같은 결과가 나옵니다.

32.0
451
Traceback (most recent call last):
  File "test.py", line 9, in 
    print(KelvinToFahrenheit(-5))
  File "test.py", line 4, in KelvinToFahrenheit
    assert (Temperature >= 0), "Colder than absolute zero!"
AssertionError: Colder than absolute zero!

예외란 무엇인가?

예외는 프로그램 실행 중에 발생하여 프로그램 명령어의 정상적인 흐름을 방해하는 이벤트입니다. 일반적으로 파이썬 스크립트가 대처할 수 없는 상황을 만나면 예외를 발생시킵니다. 예외는 오류를 나타내는 파이썬 객체입니다.

파이썬 스크립트가 예외를 발생시키면 즉시 처리해야 하며, 그렇지 않으면 프로그램이 종료됩니다.

예외 처리하기

예외를 발생시킬 수 있는 의심스러운 코드가 있다면, 해당 코드를 try: 블록에 배치하여 프로그램을 방어할 수 있습니다. try: 블록 뒤에 except: 문을 포함하고, 문제를 최대한 우아하게 처리하는 코드 블록을 따라옵니다.

구문

try....except...else 블록의 간단한 구문은 다음과 같습니다.

try:
    # 연산 수행
    ...
except ExceptionI:
    # ExceptionI 발생 시 이 블록 실행
except ExceptionII:
    # ExceptionII 발생 시 이 블록 실행
    ...
else:
    # 예외가 없으면 이 블록 실행

위 구문에 대한 몇 가지 중요한 사항은 다음과 같습니다.

예제

이 예제는 파일을 열고, 파일에 내용을 쓴 후, 문제가 없으므로 정상적으로 종료합니다.

#!/usr/bin/python
try:
    fh = open("testfile", "w")
    fh.write("This is my test file for exception handling!!")
except IOError:
    print("Error: can't find file or read data")
else:
    print("Written content in the file successfully")
    fh.close()

이 코드는 다음과 같은 결과를 출력합니다.

Written content in the file successfully

예제

이 예제는 쓰기 권한이 없는 파일을 열려고 시도하므로 예외가 발생합니다.

#!/usr/bin/python
try:
    fh = open("testfile", "r")
    fh.write("This is my test file for exception handling!!")
except IOError:
    print("Error: can't find file or read data")
else:
    print("Written content in the file successfully")

이 코드는 다음과 같은 결과를 출력합니다.

Error: can't find file or read data

예외 없는 except 절

예외를 정의하지 않고 except 문을 다음과 같이 사용할 수도 있습니다.

try:
    # 연산 수행
    ...
except:
    # 모든 예외 발생 시 이 블록 실행
    ...
else:
    # 예외가 없으면 이 블록 실행

이 종류의 try-except 문은 발생하는 모든 예외를 잡습니다. 하지만 이 방식은 좋은 프로그래밍 관행으로 간주되지 않습니다. 모든 예외를 잡지만 프로그래머가 발생할 수 있는 문제의 근본 원인을 파악하지 못하기 때문입니다.

다중 예외를 위한 except 절

동일한 except 문을 사용하여 여러 예외를 다음과 같이 처리할 수 있습니다.

try:
    # 연산 수행
    ...
except (Exception1[, Exception2[,...ExceptionN]]]):
    # 주어진 예외 리스트 중 하나라도 발생 시 이 블록 실행
    ...
else:
    # 예외가 없으면 이 블록 실행

try-finally 절

try: 블록과 함께 finally: 블록을 사용할 수 있습니다. finally 블록은 try 블록에서 예외가 발생했는지 여부와 관계없이 반드시 실행되어야 하는 코드를 넣는 곳입니다. try-finally 문의 구문은 다음과 같습니다.

try:
    # 연산 수행
    ...
    # 예외로 인해 이 부분이 건너뛸 수 있음
finally:
    # 이 부분은 항상 실행됨
    ...

else 절은 finally 절과 함께 사용할 수 없습니다.

예제

#!/usr/bin/python
try:
    fh = open("testfile", "w")
    fh.write("This is my test file for exception handling!!")
finally:
    print("Error: can't find file or read data")

파일을 쓰기 모드로 열 권한이 없으면 다음과 같은 결과가 나옵니다.

Error: can't find file or read data

같은 예제를 더 깔끔하게 작성하면 다음과 같습니다.

#!/usr/bin/python
try:
    fh = open("testfile", "w")
    try:
        fh.write("This is my test file for exception handling!!")
    finally:
        print("Going to close the file")
        fh.close()
except IOError:
    print("Error: can't find file or read data")

try 블록에서 예외가 발생하면 실행이 즉시 finally 블록으로 넘어갑니다. finally 블록의 모든 문이 실행된 후 예외가 다시 발생하며, 다음 상위 레이어의 try-except 문에 있는 except 문에서 처리됩니다(존재하는 경우).

예외의 인수

예외는 문제에 대한 추가 정보를 제공하는 값인 인수를 가질 수 있습니다. 인수의 내용은 예외마다 다릅니다. except 절에 변수를 제공하여 예외의 인수를 잡을 수 있습니다.

try:
    # 연산 수행
    ...
except ExceptionType, Argument:
    # 여기서 Argument 값 출력 가능...

단일 예외를 처리하는 코드를 작성하는 경우, except 문에서 예외 이름 뒤에 변수를 둘 수 있습니다. 여러 예외를 잡는 경우, 예외 튜플 뒤에 변수를 둘 수 있습니다.

이 변수는 주로 예외의 원인을 포함하는 예외의 값을 받습니다. 변수는 단일 값이나 튜플 형태의 여러 값을 받을 수 있습니다. 이 튜플은 보통 오류 문자열, 오류 번호, 오류 위치를 포함합니다.

예제

단일 예외에 대한 예제입니다.

#!/usr/bin/python
# 함수 정의
def temp_convert(var):
    try:
        return int(var)
    except ValueError, Argument:
        print("The argument does not contain numbers\n", Argument)

# 위 함수 호출
temp_convert("xyz")

이 코드는 다음과 같은 결과를 출력합니다.

The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'

예외 발생시키기

raise 문을 사용하여 여러 방식으로 예외를 발생시킬 수 있습니다. raise 문의 일반적인 구문은 다음과 같습니다.

구문

raise [Exception [, args [, traceback]]]

여기서 Exception은 예외 유형(예: NameError)이고, argument는 예외 인수의 값입니다. 인수는 선택 사항이며, 제공하지 않으면 예외 인수는 None입니다.

마지막 인수인 traceback도 선택 사항입니다(실제로는 거의 사용되지 않음). 존재하는 경우 예외에 사용되는 트레이스백 객체입니다.

예제

예외는 문자열, 클래스 또는 객체일 수 있습니다. 파이썬 코어가 발생시키는 대부분의 예외는 클래스이며, 인수는 해당 클래스의 인스턴스입니다. 새로운 예외를 정의하는 것은 매우 쉽습니다.

def functionName(level):
    if level < 1:
        raise "Invalid level!", level
    # 이 아래 코드는 예외를 발생시키면 실행되지 않음

참고: 예외를 잡으려면 "except" 절이 클래스 객체나 단순 문자열 중 하나로 던져진 동일한 예외를 참조해야 합니다. 예를 들어, 위 예외를 잡으려면 except 절을 다음과 같이 작성해야 합니다.

try:
    # 비즈니스 로직
except "Invalid level!":
    # 예외 처리
else:
    # 나머지 코드

사용자 정의 예외

파이썬은 표준 내장 예외에서 파생된 클래스를 만들어 자체 예외를 생성할 수 있게 합니다.

RuntimeError와 관련된 예제입니다. 여기서는 RuntimeError에서 서브클래스화된 클래스를 생성합니다. 이는 예외가 잡힐 때 더 구체적인 정보를 표시해야 할 때 유용합니다.

try 블록에서 사용자 정의 예외가 발생하고 except 블록에서 잡힙니다. 변수 e는 Networkerror 클래스의 인스턴스를 생성하는 데 사용됩니다.

class Networkerror(RuntimeError):
    def __init__(self, arg):
        self.args = arg

위 클래스를 정의한 후 다음과 같이 예외를 발생시킬 수 있습니다.

try:
    raise Networkerror("Bad hostname")
except Networkerror, e:
    print(e.args)

python

  1. 파이썬 데이터 타입 마스터하기: 실전 가이드
  2. 파이썬 연산자 마스터하기: 종합 가이드
  3. 파이썬 pass 문 마스터하기: 실전 가이드
  4. 파이썬 함수 인자 마스터하기: 위치, 키워드, 기본 매개변수
  5. Python 딕셔너리 마스터하기: 생성, 조작, 고급 기법
  6. Python 에러와 내장 예외 마스터하기
  7. Python 예외 처리 마스터하기: try, except, else, finally 완전 정복
  8. Python 사용자 정의 예외 마스터하기: 실전 가이드
  9. Python 이터레이터: 작동 원리와 직접 만들기
  10. Python 클로저 이해하기: 중첩 함수가 변수 캡처하는 방법