Programming 기초/Python

[Python 기초 #10] 예외 처리

코딩상륙작전 2023. 4. 27. 16:54

* try

try:
     ...
except [발생 오류[as 오류 메시지 변수]]:
     ...
else:     # 오류 발생하지 않은 경우 실행 (try가 참값일 때)
     ...
finally:     # 무조건 마지막에 실행

  • 여기서 [ ] 기호는 괄호 안의 내용을 생략할 수 있다는 관례 표기법이다.
  • except 발생 오류: 는 오류가 발생했을 때 except문에 미리 정해 놓은 오류 이름과 일치할 때만 except 블록을 수행한다는 뜻이다.
  • except 발생 오류 as 오류 메시지 변수: 는 오류메시지의 냉요을 알고 싶을 때, 발생오류를 지정한 오류 메시지 변수에 담는 것이다.
try:
    4/0
except ZeroDivisionError as e:
    print(e)
-----------------------------------
division by zero
  • 발생 오류에 에러코드 이름을 모를 때 Exception를 적어두면 Exception이 대부분의 에러코드를 다 포함하므로 오류 발생시 except을 실행할 수 있게 해준다.
f = open('foo.txt', 'w')
try:
    # 무언가를 수행한다.
finally:
    f.close()
  • 예외 발생 여부와 상관없이 finally 절에서 f.close()로 열린 파일을 닫는다.

 

* 오류 회피하기

try:
    f=open("나없는파일", 'r')
except Exception:
    pass
  • pass를 사용하여 오류를 회피하도록 작성할 수도 있다.

 

*오류 일부러 발생시키기

  • raise 명령어는 오류를 일부러 발생시킨다. 부모클래스를 변형해서 사용하게끔 강제하고 싶을 때, 변형하지 않고 사용하면 오류를 출력하게 만들 때 사용한다.
class Bird: #부모클래스
    def fly(self):
        raise NotImplementedError

class Eagle(Bird):  #자식클래스
    pass

 

* 예외 직접 만들기

  • 프로그램 수행 도중 특수한 경우에만 예외 처리를 하기 위해서 예외를 만들어서 사용할 때 유용하다.
  • 파이썬 내장 클래스인 Exception 클래스를 상속하여 만들 수 있다.
class MyError (Exception):
    pass


def say_nickname(nick):
    if nick == '바보':
        raise MyError()
    print(nick)


try:
    say_nickname("천재")
    say_nickname("바보")
except MyError:
    print("허용되지 않는 별명입니다.")
---------------------------------------
천재
허용되지 않는 별명입니다.
  • 위와 같은 코드를 아래처럼 오류 메시지를 사용하여 만들 수도 있다.
class MyError (Exception):
    def __str__(self):
        return "허용되지 않는 별명입니다."


def say_nickname(nick):
    if nick == '바보':
        raise MyError()
    print(nick)


try:
    say_nickname("천재")
    say_nickname("바보")
except MyError as e:
    print(e)
---------------------------------------
천재
허용되지 않는 별명입니다.
  • _ _ str_ _ 메서드는 오류 메시지를 print문으로 출력할 경우에 호출되는 메서드이다.