Python - 예외 처리(try, except, finally)

Python 코드 실행 중 예외가 발생하면 프로그램이 종료됩니다. try except로 예외를 처리하여 프로그램이 종료되지 않도록 만들 수 있습니다.

예외를 처리하는 방법 및 발생시키는 방법에 대해서 알아보겠습니다.

1. 예외가 발생하는 이유

다음과 같은 코드를 실행하면 Exception이 발생합니다. 정수를 0으로 나눌 수는 없기 때문입니다.

x = 10 / 0

다음과 같이 에러를 출력하며 프로그램은 종료됩니다.

Traceback (most recent call last):
  File "/home/js/python-example/try-example.py", line 1, in <module>
    x = 10 / 0
ZeroDivisionError: division by zero

2. 예외 처리

try except로 예외를 처리하여 프로그램이 종료되지 않도록 할 수 있습니다.

아래와 같이 try의 코드를 실행하는 중에 예외가 발생하면 except의 코드가 실행되며 예외를 처리할 수 있습니다.

try:
    x = 10 / 0
except:
    print("Exception occurred while dividing by 0")

위 코드를 실행해보면 다음과 같이 로그를 출력하지만 프로그램이 종료되진 않습니다.

Exception occurred while dividing by 0

특별한 예외만 처리

위의 예제는 코드 실행 중 어떤 예외가 발생하더라도 모두 처리가 됩니다.

다음과 같이 except ZeroDivisionError처럼 특정 예외를 명시하면 이 예외가 발생될 떄만 except의 코드가 수행됩니다.

try:
    x = 10 / 0
except ZeroDivisionError:
    print("Exception occurred while dividing by 0")

만약 다음과 같이 ZeroDivisionError가 아닌 다른 예외가 발생하면 처리되지 못하며, 프로그램은 종료됩니다.

try:
    print(x)
except ZeroDivisionError:
    print("Exception occurred while dividing by 0")

Output:

Traceback (most recent call last):
  File "/home/js/python-example/try-example.py", line 15, in <module>
    print(x)
NameError: name 'x' is not defined

다수의 예외 처리

다음과 같이 다수의 예외를 처리할 수 있습니다. 위에서 아래로 순차적으로 처리되며, 마지막의 except:ZeroDivisionError, NameError를 제외한 다른 모든 예외를 처리하게 됩니다.

try:
    x = 10 / 0
except ZeroDivisionError:
    print("Exception occurred while dividing by 0")
except NameError:
    print("NameError exception occurred")
except:
    print("A exception occurred")

3. 예외가 발생하지 않았을 때, 어떤 작업 수행

아래 코드는 예외가 발생하지 않습니다. 예외가 발생하지 않으면 except의 코드는 실행되지 않습니다. 대신에 else의 코드가 실행됩니다. 반대로 예외가 발생되면 except의 코드가 수행되며 else의 코드는 수행되지 않습니다.

try:
    x = 10 / 5
except:
    print("A exception ocrrued")
else:
    print("No exception")

Output:

No exception

4. 항상 어떤 작업이 수행되도록 하기

예외가 발생하거나 발생하지 않거나 어떤 작업이 항상 수행되도록 하려면 finally를 사용하면 됩니다.

아래 코드에서 finally의 코드는 try의 가장 마지막에 실행됩니다.

  • 예외가 발생하는 경우 : try -> except -> finally 순서로 실행됩니다.
  • 예외가 발생하지 않는 경우 : try -> else -> finally 순서로 실행됩니다.
try:
    x = 10 / 5
except:
    print("A exception ocrrued")
else:
    print("No exception")
finally:
    print("This finally block is always called")

Output:

No exception
This finally block is always called

5. 강제로 예외 발생시키기

raise 키워드를 이용하여 예외를 발생시킬 수 있습니다. 발생된 예외를 처리하지 못하면 프로그램이 종료됩니다.

x = 0

if x == 0:
    raise Exception("Can't divide by 0")

y = 10 / x

Output:

Traceback (most recent call last):
  File "/home/js/python-example/try-example.py", line 51, in <module>
    raise Exception("Can't divide by 0")
Exception: Can't divide by 0

다음과 같이 문제 상황에 맞는 Error를 발생시키면 좋습니다.

if x == 0:
    raise ZeroDivisionError("Can't divide by 0")

6. Custom Exception 구현

문제 상황에 맞는 Exception가 없을 때, Cutsom Exception를 구현할 수 있습니다.,

다음과 같이 Custom Exception을 구현할 수 있습니다.

class MyException(Exception):
    def __init__(self, value):
        self.value = value

    def raise_exception(self, err_msg):
        raise MyException(err_msg)

다음과 같이 예외를 발생시키고 처리할 수 있습니다.

try:
    raise MyException("Custom exception")
except MyException:
    print("MyException occurred")
Loading script...

Related Posts

codechachaCopyright ©2019 codechacha