7. 예외처리

 

코딩을 할 때 가장 중요한 건 오류가 발생하지 않도록 하는 것 이지만 데이터의 오류, 시스템 오류, 네트워크 오류는 어쩔 수가 없습니다.  오류를 예측하고 거기에 대한 대응을 미리 해놓을 수 있는 능력이 더 중요할 수 있습니다.

 

7.1 try ... except


try 블록을 실행 하는 동안 오류가 발생하면 곧바로 except 블록이 실행 되며 오류가 발생하지 않는다면 except 블록은 실행되지 않습니다.

 

7.1.1 발생오류를 모르는 경우

 

발생할 오류의 항목을 모르는 경우 오류 항목을 기입하지 않고 except만 적어서 처리를 하는 경우 입니다.

try:

   이런 저런 명령어 처리

except:

   print(“알 수 없는 오류로 인하여 프로그램이 종료 되었습니다.”)

 

python study

 


7.1.2 발생오류 명기


try 블록에서 발생할 오류에 대해 예상이 가능한 경우 오류 항목을 추가하여 처리하는 경우 입니다.

try:

 fd = open(“filename.txt”, ‘r’)

   line = fd.readline()

except FileNotFoundError:

   print(“요청하신 파일을 찾을 수 없습니다.”)

 

발생할 수 있는 오류가 여러 개인 경우 except를 추가 합니다. 

try:

 fd = open(“filename.txt”, ‘r’)

   line = fd.readline()

except OSError:

   print(“OS 오류가 발생 했습니다.”)

except FileNotFoundError:

   print(“요청하신 파일을 찾을 수 없습니다.”)

except:

 print(“알 수 없는 오류가 발생 했습니다.”)

 

 

7.1.3 else (오류 없는 경우)

 

try 블록을 실행하는 동안 오류가 발생하지 않은 경우에만 실행을 하는 블록 입니다.  finally와의 차이점은 finally는 오류가 발생 해도 실행을 하는 블록 입니다.

try:

 fd = open(“filename.txt”, ‘r’)

   line = fd.readline()

except OSError:

   print(“OS 오류가 발생 했습니다.”)

except FileNotFoundError:

   print(“요청하신 파일을 찾을 수 없습니다.”)

except:

 print(“알 수 없는 오류가 발생 했습니다.”)

else:

   print(“오류가 발생하지 않았습니다.”)

 

 

7.1.4 pass (예외상황 회피)

 

예외 상황이 발생 했을 때 프로세스를 중단 하지 않으면서 예외사항을 무시하고 다음 단계로 넘어가기 위한 방법으로 아무일 없었다는 듯 하단 명령을 실행 합니다.

try:

 fd = open(“filename.txt”, ‘r’)

   line = fd.readline()

except OSError:

   print(“OS 오류가 발생 했습니다.”)

except FileNotFoundError:

   pass

 

 

7.1.5 as (오류 클래스 축약)

 

오류 클래스 명이 긴 경우 as를 이용하여 짧은 이름의  alias에 대입 하여 사용할 수 있습니다.

try:

 fd = open(“filename.txt”, ‘r’)

   line = fd.readline()

except OSError as oe:

   print(oe)

except FileNotFoundError as e:

   print(e)

 

 

7.1.6 finally (무조건 실행)

 

try 블록을 실행 하는 동안 오류가 발생해서 프로그램이 종료 되더라도 꼭 실행을 해야 하는 명령어를 finally 블록에 추가 합니다.  대부분 리소스를 반납해야 하는 close 문들입니다.

try:

 fd = open(“filename.txt”, ‘r’)

   line = fd.readline()

finally:

   fd.close()

 

 

 

7.2 예외 만들기

 

raise를 이용하면 사용자가 임의로 예외를 발생시킬 수 있습니다.


7.2.1 내부 예외 클래스 호출


내부에 정의된 예외사항을 사용자가 임의로 호출하여 사용할 수 있습니다.

a = 100

 

if a <= 150:

           try:

                     raise ValueError

                     b = 2500 / a

           except ZeroDivisionError:

                     print("zero div")

           except ValueError:

                     print("number small")

결과

(base) F:\Python>python except001.py

number small

 

7.2.2 사용자 정의 예외 클래스 호출


사용자가 직접 Exception 클래스를 상속받아 새로운 예외 클래스를 생성하여 호출할 수 있습니다.

class UserError(Exception):

           def __init__(self, value):

                     self.value = value

           def __str__(self):

                     return self.value

 

# 신규 예외사항 사용

a = 100

 

if a <= 150:

           try:

                     raise UserError("Number error")

                     b = 2500 / a

           except ZeroDivisionError:

                     print("zero div")

결과

(base) F:\Python>python except002.py

Traceback (most recent call last):

  File "except002.py", line 12, in <module>

    raise UserError("Number error")

__main__.UserError: Number error

 

 

7.3 with

 

with문은 예외처리 라기 보다는 미리 후선 마무리 작업이 정의되어 있는 명령어 입니다.

with open(“filename.txt”) as fd:

    for line in fd:

        print(line, end="")

 

with문은 Object.enter를 호출하고 자동으로 Object.exit를 호출 하도록 만들어진 것으로 별도의 처리를 해주지 않아도 됩니다.

 

 

7.4 Exception 구조 (Python 3.7)

 

파이썬 내장 예외사항 클래스 계층 구조 입니다.  필요한 예외사항이 있으면 사용하면 됩니다.

BaseException

 +-- SystemExit

 +-- KeyboardInterrupt

 +-- GeneratorExit

 +-- Exception

      +-- StopIteration

      +-- StopAsyncIteration

      +-- ArithmeticError

      |    +-- FloatingPointError

      |    +-- OverflowError

      |    +-- ZeroDivisionError

      +-- AssertionError

      +-- AttributeError

      +-- BufferError

      +-- EOFError

      +-- ImportError

      |    +-- ModuleNotFoundError

      +-- LookupError

      |    +-- IndexError

      |    +-- KeyError

      +-- MemoryError

      +-- NameError

      |    +-- UnboundLocalError

      +-- OSError

      |    +-- BlockingIOError

      |    +-- ChildProcessError

      |    +-- ConnectionError

      |    |    +-- BrokenPipeError

      |    |    +-- ConnectionAbortedError

      |    |    +-- ConnectionRefusedError

      |    |    +-- ConnectionResetError

      |    +-- FileExistsError

      |    +-- FileNotFoundError

      |    +-- InterruptedError

      |    +-- IsADirectoryError

      |    +-- NotADirectoryError

      |    +-- PermissionError

      |    +-- ProcessLookupError

      |    +-- TimeoutError

      +-- ReferenceError

      +-- RuntimeError

      |    +-- NotImplementedError

      |    +-- RecursionError

      +-- SyntaxError

      |    +-- IndentationError

      |         +-- TabError

      +-- SystemError

      +-- TypeError

      +-- ValueError

      |    +-- UnicodeError

      |         +-- UnicodeDecodeError

      |         +-- UnicodeEncodeError

      |         +-- UnicodeTranslateError

      +-- Warning

           +-- DeprecationWarning

           +-- PendingDeprecationWarning

           +-- RuntimeWarning

           +-- SyntaxWarning

           +-- UserWarning

           +-- FutureWarning

           +-- ImportWarning

           +-- UnicodeWarning

           +-- BytesWarning

           +-- ResourceWarning

 

- copy coding -


+ Recent posts