상세 컨텐츠

본문 제목

Python 18. 예외 처리

파이썬

by 아리벱 2024. 3. 21. 16:17

본문

파이썬을 사용해 본 적이 있는 유저라면 한 번쯤은 에러(오류)를 출력해서 당황했던 경험이 있을 것입니다. 에러가 발생하면 원하던 코드를 실행하지 못하기 때문에 중단됨을 방지하거나 다른 정보를 제공해주는 문법이 있습니다. 어떤 방법인지 소개하려고 합니다.

 

1. 예외

예외(Exception)는 프로그램 실행 중 발생할 수 있는 예상치 못한 문제 또는 오류 상황을 의미합니다. 예외가 발생하면 프로그램은 중단되기 때문에 이를 적절하게 처리하여 중단을 방지하거나 오류에 대한 정보를 사용자에게 제공해야 합니다.

 

수학 시간에 배웠던 지식으로 0을 분자에 넣게 되면 불능임을 잘 알고 있습니다. 파이썬에서의 연산도 에러가 발생합니다. 따라서 print(5/0)에서 에러가 발생하여 print(4/2)가 실행되기 전에 중단됩니다. 이를 방지하고 오류가 발생시에 다른 값을 출력하는 방식을 사용하여 유저에게 정보를 제공해주는 방법이 있습니다.

print(5/0)을 실행했을 시 ZeroDivisionError를 출력합니다. 이때에 try-except문을 이용합니다. try를 서두에 작성하고 except 뒤에 ZeroDivisionError를 작성하여 ZeroDivisionError 때문에 에러 난 경우 except 블록(print('0으로 나눌 수 없습니다.'))을 출력하는 방식입니다.

위의 경우는 try-except 구문을 사용하는 대신 except 뒤에 아무것도 작성하지 않는 방식입니다. 이 경우에는 에러의 종류에 관계없이 except 블록을 실행합니다.

 

위에서는 이런게 있구나정도로만 알았다면 이번에는 정확한 문법에 대해서 살펴보겠습니다.

2. 예외 처리 기본 구조

 

ValueError

  • 잘못된 값을 함수나 연산에 제공할 때 발생합니다.
  • 예) 숫자가 아닌 문자열을 int() 함수로 변환하려고 할 때 발생.

TypeError

  • 올바르지 않은 유형의 객체를 연산에 사용하려 할 때 발생합니다.
  • 예) 문자열과 숫자를 함께 더하려고 할 때 발생.

ZeroDivisionError

  • 숫자를 0으로 나누려고 할 때 발생합니다.

IndexError

  • 리스트, 튜플, 문자열 등의 시퀀스 유형에서 범위를 벗어난 인덱스에 접근하려 할 때 발생합니다.
  • 예) 길이가 3인 리스트에 대해 4번째 요소에 접근하려고 할 때 발생.

KeyError

  • 딕셔너리에서 존재하지 않는 키를 사용하여 값을 검색하려고 할 때 발생합니다.

AttributeError

  • 객체에 없는 속성이나 메서드에 접근하려고 할 때 발생합니다.

FileNotFoundError

  • 존재하지 않는 파일을 열려고 할 때 발생합니다.

ImportError

  • 존재하지 않는 모듈을 가져오려고 할 때 또는 모듈 내에 해당 속성/함수가 없을 때 발생합니다.

NameError

  • 정의되지 않은 변수나 함수를 사용하려고 할 때 발생합니다.
  • 예) 프로그램에서 정의되지 않은 변수 x를 사용하려고 할 때 발생.

OverflowError

  • 수치 연산 결과가 너무 커서 표현할 수 없을 때 발생합니다.

MemoryError

  • 프로그램이 사용 가능한 모든 메모리를 소진했을  발생합니다.

 

```

try:

     # 예외가 발생할 가능성이 있는 코드

 

except ExceptionType1:  # 'ExceptionType1'에는 실제 예외 유형이 들어갑니다.

       # ExceptionType1 예외가 발생했을 때 실행될 코드

except ExceptionType2:  # 'ExceptionType2'에는 다른 예외 유형이 들어갑니다.

       # ExceptionType2 예외가 발생했을 때 실행될 코드

 

 # 추가적인 except 블록을 계속 추가할 수 있습니다.

 

else:

     # try 블록에서 예외가 발생하지 않았을 때 실행될 코드

finally:

     # 예외 발생 여부와 관계없이 항상 실행될 코드

```

 

print(data[5]) 실행시 IndexError가 출력되기 때문에 try-except 구문을 이용할 수 있습니다. except 뒤에 특정 에러 타입을 작성하면 특정 에러가 발생 시에 except 블록을 출력하게 합니다.

 

아래의 경우는 int('일'), 5/0, data[5] 모두 에러가 발생될 것으로 기대됩니다. 순차적으로 주석 처리를 하면서 출력해보겠습니다.

 

마지막으로 모든 오류를 처리하는 except는 마지막에 위치시켜야 합니다.

 

마지막에 본 Exception 클래스에 대하여 더 자세히 알아볼까요??

3. Exception 클래스

Exception 클래스는 파이썬의 내장 예외 계층 구조에서 거의 모든 내장 예외의 기본 클래스입니다. 이 클래스는 사용자 정의 예외를 만들거나 특정 예외 유형을 잡기 위한 기본적인 인터페이스를 제공합니다.

 

raise Exception('에러가 발생했어요.')로 예외를 발생시킵니다. 이때 Exception에 넣은 에러 메시지는 except Exception as e의 e에 들어있습니다.

따라서 print(e)를 하게되면 에러가 발생했어요가 출력됩니다.

마찬가지로 raise Exception('짝수가 아닙니다.')로 예외를 발생시킵니다. 이때에도 Exception에 넣은 에러 메시지는 except Exception as e의 e에 들어있습니다. 따라서 2로 나누어서 나머지가 0이 아닌 5를 입력하면 예외가 실행되어 print('예외가 발새이 ', e)가 출력됩니다.

 

3번째 대입

 

마지막 대입
2번째 대입
1번째 대입

 

위의 코드를 보면 '%d'에는 정수를 입력해야 하므로 print('%d' % '문자열')은 에러가 발생할 것입니다.

따라서 except 문을 작성해서 프로그램이 중단되지 않고 '타입이 올바르지 않습니다.'라는 값을 출력하려고 합니다. 이때의 순서는 주석처리한 것으로 알 수 있듯이 func1()메소드 정의, func2() 메소드 정의, func3() 메소드 정의, func1() 메소드 호출 어느 곳에 작성하여도 관계 없습니다. 

 

4. 사용자 정의 예외 클래스를 직접 만들고 활용하기

 

알고리즘을 살펴보면 check_age 메소드를 호출한 경우에 17이면 20보다 작기 때문에 에러를 발생시켜 Error for age 17 : 나이 범위보다 어림을 출력합니다. 이때 {e.age}는 AgeLimitError의 age 속성과 같아 17로 주어졌기 때문에 17이 출력되고 {e}는 raise AgeLimitError(age, '나이 범위보다 어림')이기 때문에 '나이 범위보다 어림'으로 '나이 범위보다 어림' 이 출력됩니다.

'파이썬' 카테고리의 다른 글

Python 21. 단어장!  (0) 2024.03.22
Python 20. 파일 입출력  (0) 2024.03.22
Python 17. Special method  (0) 2024.03.20
Python 16. 상속  (0) 2024.03.20
Python 15. 객체 지향과 클래스  (0) 2024.03.20

관련글 더보기