59. 파이썬 예외 만들기 – 예외 처리 #5

59. 파이썬 예외 만들기 – 예외 처리 #5

지난 시간에는 파이썬 예외 처리 중 오류 회피 하는 방법과 오류를 일부러 발생시키는 방법에 대해 알아보았습니다. 이번 포스팅에서는 예외 처리의 이어지는 내용으로 예외 만들기에 대해 공부해 보도록 하겠습니다.

파이썬 예외 처리 #5

파이썬 예외 만들기

프로그램을 수행 하는 도중에 특수한 경우에만 예외 처리를 하기 위해서는 가끔 예외를 만들어서 사용을 하게 됩니다.
그런 예외를 직접 만들어 보겠습니다.
예외는 아래 코드와 같이 파이썬에 내장 클래스인 Exception 클래스를 상속하여 만들 수 있습니다.

Python
class CodingError(Exception):
    pass

아래와 같이 별명을 출력하는 함수를 만들어 보겠습니다.

Python
def say_nick(nick):
    if nick == '악마':
        raise CodingError()
    print(nick)

say_nick("천사")
say_nick("악마")

위 코드를 실행을 해보면 아래와 같이 “천사” 라는 단어를 한 번 출력 시킨 후 CodingError 가 발생을 하게 됩니다.

Python
(py_study_31010) D:\Dropbox.My_Job.Study.Python
(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>python test.py
천사
Traceback (most recent call last):
  File "D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\test.py", line 206, in <module>
    say_nick("악마")
  File "D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\test.py", line 202, in say_nick
    raise CodingError()
__main__.CodingError
.study_python_3.11.0.TEST>python test.py
천사 Traceback (most recent call last): File "D:\Dropbox.My_Job.Study.Python
(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>python test.py
천사
Traceback (most recent call last):
  File "D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\test.py", line 206, in <module>
    say_nick("악마")
  File "D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\test.py", line 202, in say_nick
    raise CodingError()
__main__.CodingError
.study_python_3.11.0.TEST\test.py", line 206, in <module>
say_nick("악마") File "D:\Dropbox.My_Job.Study.Python
(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>python test.py
천사
Traceback (most recent call last):
  File "D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\test.py", line 206, in <module>
    say_nick("악마")
  File "D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST\test.py", line 202, in say_nick
    raise CodingError()
__main__.CodingError
.study_python_3.11.0.TEST\test.py", line 202, in say_nick
raise CodingError() __main__.CodingError

이번에는 예외 처리 기법을 사용해서 CodingError 발생을 예외 처리를 해 보겠습니다.

Python
def say_nick(nick):
    if nick == '악마':
        raise CodingError()
    print(nick)

try:
    say_nick("천사")
    say_nick("악마")
except CodingError:
    print("이 별명은 허용되지 않은 별명입니다.")

기존에 있던 코드에 try … except 구문을 사용해서 예외 처리를 해주었습니다.
위 코드를 실행해 보면 아래처럼 출력이 됩니다.

Python
(py_study_31010) D:\Dropbox.My_Job.Study.Python
(py_study_31010) D:\Dropbox.My_Job.Study.Python
(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>python test.py
천사
이 별명은 허용되지 않은 별명입니다.
.study_python_3.11.0.TEST>python test.py
천사 이 별명은 허용되지 않은 별명입니다.
.study_python_3.11.0.TEST>python test.py
천사 이 별명은 허용되지 않은 별명입니다.

만약에 여기서 나오는 오류 메시지를 사용을 하고 싶다면 아래 코드와 같이 예외 처리를 해 주면 됩니다.

Python
try:
    say_nick("천사")
    say_nick("악마")
except CodingError as e:
    print(e)

하지만 막상 프로그램을 실행을 해보게 되면 print(e) 로 오류 메시지가 출력이 되지를 않습니다.

Python
(py_study_31010) D:\Dropbox.My_Job.Study.Python
(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>python test.py
천사
.study_python_3.11.0.TEST>python test.py
천사

오류 메시지를 출력했을 때 오류 메시지가 보이게 하려면 오류 클래스에 아래 처럼 __str__ 메서드를 구현을 해야 합니다.
__str__ 메서드는 print(e) 처럼 오류 메시지를 print 문으로 출력할 경우에 호출 되는 메서드입니다.
최종 코드는 아래와 같습니다.

Python
class CodingError(Exception):
    def __str__(self):
        return "이 별명은 허용되지 않은 별명입니다."

def say_nick(nick):
    if nick == '악마':
        raise CodingError()
    print(nick)

try:
    say_nick("천사")
    say_nick("악마")
except CodingError as e:
    print(e)

이제 위 코드를 다시 실행을 해보게 되면 “이 별명은 허용되지 않은 별명입니다.” 라는 오류메시지를 출력하는걸 확인 할 수 있습니다.

Python
(py_study_31010) D:\Dropbox.My_Job.Study.Python
(py_study_31010) D:\Dropbox.My_Job.Study.Python
(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>python test.py
천사
이 별명은 허용되지 않은 별명입니다.
.study_python_3.11.0.TEST>python test.py
천사 이 별명은 허용되지 않은 별명입니다.
.study_python_3.11.0.TEST>python test.py
천사 이 별명은 허용되지 않은 별명입니다.

  • 이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
59. 파이썬 - 예외 처리 #5 예외 만들기

57. 파이썬 – 예외 처리 #3 try .. finally 와 try … else

57. 파이썬 – 예외 처리 #3 try .. finally 와 try … else

지난 포스팅에서 예외 처리 상황과 대처 방법에 대해서 공부를 했고 이번 포스팅에서도 파이썬 예외 처리 중 try .. finally 와 try … else 에 대해 공부해 보도록 하겠습니다

파이썬 예외 처리 #3

예외 처리 상황과 대처 방법

try .. finally

try 문에는 finally 절을 사용할 수 있습니다.
finally 절은 try 문을 수행 하는 도중에 예외가 발생 하는것과 상관 없이 항상 수행을 하게 됩니다.
일반적으로 finally 문장은 사용했던 리소스를 close 할 때 많이 사용하게 됩니다

Python
try:
    f = open('foo.txt', 'w')
    # 무 언 가 를 수 행 한 다.

    (... 생 략 ...)

finally:
    f.close() # 중간에 오류가 발생하더라도 무조건 실행 되게 됩니다..

위 코드에서 처럼 foo.txt 파일을 예전에 공부했던 대로 쓰기 모드(‘w’) 로 열어 준 후에 try 문을 수행하게 되면 예외가 발생하는 것과는 관계없이 finally 문장에서 f.close() 로 열려 있던 파일을 닫을 수가 있습니다.

여러 개의 오류 처리

여러 개의 오류를 처리 하기 위해서 try 문을 사용하는 방법입니다.

Python
try:
    ...
except 발생하는 오류 1:
    ...
except 발생하는 오류 2:
    ...

위에서 처럼 try 문을 사용하는 방법을 사용하여 이전에 0 으로 나누었을 때 발생하는 오류와 인덱싱 오류를 아래와 같이 처리 할 수 있습니다.

Python
>>> try:
...     a = [1,2]
...     print(a[3])
...     4/0
... except ZeroDivisionError as e:
...     print(e)
... except IndexError as e:
...     print(e)
...
list index out of range
>>>

일단 위처럼 실행을 하게 되면 list index out of range 오류 메시지가 출력이 됩니다.
그리고 아래 코드와 같이 ZeroDivisionError 와 IndexError 오류를 함께 처리 할 수가 있습니다.

Python
>>> try:
...     a = [1, 2]
...     print(a[3])
...     4/0
... except (ZeroDivisionError, IndexError) as e:
...     print(e)
...
list index out of range
>>>

위 코드처럼 2개 이상의 오류를 함께 처리하기 위해서 괄호를 사용해서 함께 묶어서 처리를 할 수가 있습니다.
list index out of range 오류의 경우는 이전 포스팅에서 말씀드린대로 리스트의 주소는 0 부터 시작하는데 실제로 리스트의 갯수는 2개만 있으므로 a[3] 은 리스트에 없는 주소임을 나타내 주는 오류 입니다.

try … else

try 문에서도 if 문장 에서 처럼 else 문장을 사용 할 수가 있습니다.

Python
try:
    ...
except [발생 오류 [as 오류 변수]]:
    ...
else # 오류가 없을 경우에만 수행이 됩니다.
    ...

위 코드처럼 try 문을 수행을 하다가 오류가 발생 하게 되면 except 문장이 수행이 되며 오류가 없다면 다음에 있는 else 문장이 실행이 됩니다.

try .. else 예제

다음 코드를 살펴 보겠습니다.

Python
>>> try:
...     age = int(input('나이를 입력 해 주세요 :'))
... except:
...     print('입력한 나이가 정확하지 않습니다.')
... else:
...     if age <= 18:
...         print('미성년자는 출입이 제한됩니다.')
...     else:
...         print('성인은 환영합니다~')
...
나이를 입력 해 주세요 :열다섯
입력한 나이가 정확하지 않습니다.
>>>

위 코드 숫자가 아닌 문장을 입력하게 되면 ‘입력한 나이가 정확하지 않습니다.’ 라는 문장을 출력을 하게 됩니다.
이렇게 오류가 없을 경우에만 else 문장이 실행이 됩니다.

  • 이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
57. 파이썬 - 예외 처리 #3 try .. finally 와 try … else

56. 파이썬 – 예외 처리 #2 예외 처리 상황과 대처 방법

56. 파이썬 – 예외 처리 #2 예외 처리 상황과 대처 방법

지난 시간까지 relative 패키지가 어떤 건지 알아보고 예외 처리에 대해 간단히 살펴봤습니다.

이번 포스팅에서는 예외 처리 상황과 대처 방법에 대해 알아보도록 하겠습니다.

파이썬 예외 처리 #2

예외 처리 상황과 대처 방법

0 으로 나누기. ZeroDivisionError

사칙연산 중에 나누기 를 할 때 이전의 예에서도 여러번 접해봤지만
0으로 나누는 경우에는 ZeroDivisionError 를 만나는 경우를 봤었습니다.
프로그래밍 중에 나누기가 들어간다면 꼭 확인하고 넘어가야 하는게 0 으로 나누기 를 하는 경우입니다.

정말 자주 발생하는 오류 중에 하나입니다.

Python
>>> 3/0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>>

위 코드에서는 3 을 0 으로 나누려 해봤습니다.
바로 ZeroDivisionError 오류가 발생 하게 됩니다.

IndexError

자주 발생하는 오류 중에 하나입니다.

Python
>>> a = [1, 2, 3]
>>> a[4]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>>

a 라는 리스트에는 [1, 2, 3]의 값이 저장되어 있습니다.
이전에 공부해 봤던 것처럼 파이썬에서 주소는 0 부터 시작을 하게 됩니다.
여기서 a[4] 는 실제로 a 라는 리스트의 주소 중 다섯 번째 주소를 의미합니다.
a 리스트에는 3개의 값만이 할당이 되어 있기 때문에 a[4] 는 나올 수가 없는 값입니다.
결국 IndexError 오류가 발생하게 됩니다.

이런 오류가 발생하게 되면 파이썬은 실행 중이던 프로그램을 중단을 하고 그에 맞는 오류 메세지를 보여 주게 됩니다.

오류 처리 예외 기법

원활한 프로그램을 작성하기 위해서는 오류 처리 방법을 잘 알아야 합니다.

try, except 문

try, except 문은 오류를 처리 하기 위한 예외 기법으로 많이 사용을 하고 있습니다.
아래는 try, except 문의 기본적인 구조입니다.

Python
try:
    ...
except [발생하는 오류 [as 오류 변수]]:

try 문장 수행을 하던 도중 만약 오류가 발생을 하게 되면 except 문장으로 가게 됩니다.
만일 try 문장을 수행을 하던 도중 오류가 발생하지 않는 다면 except 문장은 실행이 되지 않습니다.

except 문장의 구조를 살펴 보겠습니다.

Python
except[발생오류 [as 오류 변수]]:

위 except 문의 구조를 보시다 시피 [] 기호를 사용하게 됩니다.
이 [](대괄호) 기호는 괄호 안의 내용을 생략할 수 있다는 관례적인 표기법입니다.
따라서 아래 처럼 except 문은 3 가지로 사용 할 수가 있습니다.

1. try, except 만 사용하기
Python
try:
    ...
except 발생 오류:
    ...

이런 경우에는 오류와 상관없이 오류가 발생 하게 되면 except 블록을 수행 하게 됩니다.

2. 발생 오류만 포함하는 except 문
Python
try:
    ...
except 발생오류:
    ...

위 같은 경우에는 오류가 발생할 경우에 except 문에 미리 정해 놓은 오류와 동일한 오류일 경우에만 except 블록을 수행한다는 뜻입니다.

3. 발생 오류와 오류 변수까지 포함한 except 문
Python
try:
  ...
except 발생 오류 as 오류 변수:
    ...

이런 경우에 오류의 내용까지 알고 싶을 때 사용하는 방법입니다.
아래 코드를 살펴 보겠습니다.

Python
try:
    5 / 0
except ZeroDivisionError as e:
    print(e)

이전에 ZeroDivisionError 오류가 발생하는 경우를 살펴봤는데 위 코드처럼 except 문에 ZeroDivisionError 오류가 발생할 경우에 예외 처리를 하게 되면 ZeroDivisionError 오류가 발생을 하게 되면 except 문장이 실행이 되고 오류 변수 e 에 담기게 되는 오류 메시지를 출력을 할 수 있게 됩니다.
출력한 오류 메시지입니다.

Python
division by zero

  • 이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
56. 파이썬 – 예외 처리 #2 예외 처리 상황과 대처 방법