4.13. 파이썬 에러처리

프로그램을 만들다 보면 수없이 많은 에러가 발생합니다. 물론 오류가 발생하는 이유는 프로그램이 잘못 동작되는 것을 막기 위한 것입니다. Python은 Python 프로그램의 예상치 못한 오류를 처리하고 디버깅 기능을 추가하는 두 가지 중요한 기능을 제공합니다.

  • 예외 처리(Exception Handling)

  • 어설션(Assertions)

3.13.1. Assertions

프로그램의 특정 지점에서 반드시 참(True)이 되어야 하는 문장을 말합니다. 일반적으로 오류를 확인하기 위해 코드에 Assertion을 넣습니다. Assertion이 실패하면 (즉, 표현식이 거짓으로 평가되는 경우) 프로그램이 중지되고 오류 메시지가 표시됩니다.

다음의 예제를 실행해 보면 개념이 명확해집니다.

import time
 lists = [1,3,6,3,8,7,13,23,13,2,3.14,2,3,7]

 def test(t):
     print("현재 수행중인 값 =" + str(t))
     assert (type(t) is int), "주어진 값 " + str(t) + " 은 정수가 아닙니다"

 for i in lists:
   test(i)
   time.sleep(1)
현재 수행중인 값 =23
현재 수행중인 값 =13
현재 수행중인 값 =2
현재 수행중인 값 =3.14
Traceback (most recent call last):
  File "C:/Users/nains/PycharmProjects/OneBook/JustTest.py", line 9, in <module>
    test(i)
  File "C:/Users/nains/PycharmProjects/OneBook/JustTest.py", line 6, in test
    assert (type(t) is int), "주어진 값 " + str(t) + " 은 정수가 아닙니다"
AssertionError: 주어진 값 3.14 은 정수가 아닙니다
Process finished with exit code 1

3.13.2. 예외 처리(Exception Handling)

문법과 관련된 에러는 파이썬 인터프리터에서 에러메시지를 표시하여 디버깅이 가능합니다. 문장이나 표현식이 문법적으로 올바르다 할지라도, 실행하려고 하면 에러를 일으킬 수 있습니다. 실행 중에 감지되는 에러들을 예외(Exception) 라고 합니다. 예외는 프로그램 실행 중에 발생하여 프로그램의 명령 흐름을 방해하는 이벤트입니다. 일반적으로, 파이썬은 대처할 수 없는 상황에 처하게 되면 예외를 발생시킵니다. 예외는 오류를 나타내는 Python 객체입니다. 예외가 발생되면 즉시 예외를 처리해야합니다. 그렇지 않으면 파이썬이 종료됩니다.

예외처리를 위해 try, except문을 사용합니다. try, except 문에 대한 기본적인 구조는 아래와 같습니다.

try:
   You do your operations here;
   ......................
except ExceptionI:
   If there is ExceptionI, then execute this block.
except ExceptionII:
   If there is ExceptionII, then execute this block.
   ......................
else:
   If there is no exception then execute this block. 

예외를 발생시킬 수 있는 의심스러운 코드가 있는 경우 try: 블록에 의심스러운 코드를 넣어 프로그램을 방어적으로 코딩합니다. try: 블록 다음에 except: 문을 포함시키고 예외 문제를 처리하는 코드 블록을 추가합니다.

이 예제는 쓰기 권한을 주고 파일을 열어 기록 하므로 정상 적으로 처리 됩니다.

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()

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

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")

아래 코드와 같이 finally 문을 사용 할 수도 있습니다.

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 문의 다음 상위 계층에 있으면 exceptsatements에서 처리됩니다.

3.13.3. Exception의 인수(Argument)

exception에는 추가 정보를 제공하는 인수가 있을 수 있습니다. 인수의 내용은 예외에 따라 다릅니다. 다음과 같이 except 절에 변수를 제공하여 예외의 인수를 캡처합니다.

try:
   You do your operations here;
   ......................
except ExceptionType, Argument:
   You can print value of Argument here...

단일 exception을 처리하기위한 코드를 작성하는 경우 except 문에서 예외 이름 뒤에 변수를 지정할 수 있습니다. 여러 exception을 트래핑하는 경우 exception 튜플을 사용할 수 있습니다.

이 변수는 대부분 exception의 원인을 포함하는 exception의 값을 받습니다. 변수는 하나의 값 또는 튜플 형태의 다중 값을 수신할 수 있습니다. 이 튜플은 대개 오류 문자열, 오류 번호 및 오류 위치를 포함합니다.

# Define a function here.
 def temp_convert(var):
    try:
       return int(var)
    except ValueError as Argument:
       print("The argument does not contain numbers\n", Argument)

 # Call above function here.
 temp_convert("xyz");

위의 코드는 다음과 같은 결과로 처리 됩니다.

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

3.13.4. Exceptions의 발생

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

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

여기서 Exception은 예외의 유형 (예: Error명)이고 argument는 예외 인수 값입니다. 인수는 선택 사항으로 제공되지 않으면 예외 인수는 없는것으로 처리됩니다.

마지막 인자인 traceback은 선택적이며 (실제로는 거의 사용되지 않는다.), 존재한다면 예외에 사용되는 traceback 객체입니다.

예외는 문자열, 클래스 또는 객체가 될 수 있습니다. 파이썬 코어가 제기하는 대부분의 예외는 클래스이며, 클래스의 인스턴스인 인수가 있습니다. 새로운 예외를 정의하는 것은 매우 쉽고 다음과 같이 할 수 있습니다.

def functionName( level ):
   if level < 1:
      raise "Invalid level!", level
      # The code below to this would not be executed
      # if we raise the exception

다음과 같은 예제를 실행해 보겠습니다.

x = 5
if x < 10:
    raise ValueError('x should not be less than 10!')

Last updated