[파이썬] 예외처리 try except finally
파이썬에서는 오류가 발생하면 어디서 어떤 오류가 발생했는지 알려주면서 프로그램을 중단시킨다.
이런 오류 발생 시 상황에 따라 오류가 다른데
리스트의 범위 밖을 참조하면 IndexError: list index out of range 에러가 발생하고
0으로 나누려는 시도를 했을 때는 ZeroDivisionError: division by zero 오류가 발생한다.
이런 오류는 프로그램을 중단시키는데 사용자가 프로그램을 사용하던 중 오류를 만나 프로그램이 중단되는 것보다 적절히 처리시켜주는 것이 좋다.
예외 처리 방법
1. try, except만 쓰는 방법
try:
<처리할 내용 (오류 발생 가능 내용)>
except:
<예외 처리 내용>
이 경우는 오류 종류에 상관없이 오류가 발생하기만 하면 except 블록을 수행한다.
2. 발생 오류만 포함한 except문
try:
<처리할 내용 (오류 발생 가능 내용)>
except 발생 오류:
<예외 처리 내용>
오류가 발생했을 때 except문에 미리 정해 놓은 오류 이름과 일치할 때만 except 블록을 수행한다는 뜻이다.
3. 발생 오류와 오류 메시지 변수까지 포함한 except문
try:
<처리할 내용 (오류 발생 가능 내용)>
except 발생 오류 as 오류 메시지 변수:
<예외 처리 내용>
try:
<처리할 내용>
except ZeroDivisionError as e:
print(e)
except IndexError as e:
print(e)
2개 이상의 오류를 동시에 처리하기
try:
<처리할 내용>
except (ZeroDivisionError, IndexError) as e:
print(e)
4. 발생오류와 관계없이 항상 수행 try .. finally
try문에는 finally절을 사용할 수 있다. finally절은 try문 수행 도중 예외 발생 여부에 상관없이 항상 수행된다.
보통 finally절은 사용한 리소스를 close해야 할 경우에 많이 사용된다.
try:
f = open("없는 파일","r")
finally
f.close()
오류 회피하기
프로그래밍을 하다 보면 특정 오류가 발생할 경우 그냥 통과시켜야 할 때가 있을 수 있다.
try:
f = open("파일이름", 'r')
except FileNotFoundError:
pass
try문 내에서 FileNotFoundError가 발생할 경우 pass를 사용하여 오류를 회피한다.
오류 일부러 발생시키기
raise라는 명령어를 이용해 오류를 강제로 발생시킬 수 있다.
클래스를 상속받는 자식 클래스에서 함수를 구현하도록 만들고 싶은 경우 사용한다.
class Unit:
def attack(self):
raise NotImplementedError
class Marine(Unit):
def attack(self):
print("attack")
오류 만들기
프로그램 수행 도중 특수한 경우에만 예외처리를 하기 위해서 종종 오류를 만들어서 사용할 수 있다.
파이썬 내장 클래스인 Exception클래스를 상속하여 만들 수 있다.
오류 메시지를 출력했을 때 오류 메시지가 보이게 하기 위해서는 오류 클래스에 __str__() 매서드를 구현해야 한다.
__str__ 메서드는 print(e) 처럼 오류메시지를 print문으로 출력할 경우에 호출되는 메서드이다.
만약 에러 발생시점에 오류메시지를 전달하고 싶다면 다음과 같이 수정해야 한다.
class CustomError(Exception):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return self.msg
'파이썬 > 파이썬 기본 문법' 카테고리의 다른 글
[파이썬] 외장함수 1 (0) | 2018.12.11 |
---|---|
[파이썬] 내장함수 (0) | 2018.12.11 |
[파이썬] 모듈 Module (0) | 2018.12.11 |
[파이썬] 클래스 Class (0) | 2018.12.11 |
[파이썬] 파일 입출력 File I/O input output (0) | 2018.12.10 |
댓글