프로그램을 만들다보면 수없이 많은 오류를 만나게 된다
오류를 만나기 싫을 때, 예외처리 해주는 것이 try, except문이다
오류를 처리하는 방법을 알기 전에, 어떤 상황에서 오류가 발생하는지 한 번 알아보자
f = open("나없는 파일",'r')
이렇게 입력하면 FileNotFoundError:no such file or directory : '나없는 파일' 이라고 뜬다
또 다른 예를 들어 숫자를 0으로 나눈다고 하면 ZeroDivisionError가 뜬다
등등 여러가지 많은 오류를 맞이하게 될 거다
try :
except [발생 오류[as 오류 메시지 변수]] :
try문 실행 중 오류가 발생하면 except 문이 발생한다는 뜻이다
해당 구문도 3가지로 나눌 수 있는데
try :
except :
이 경우, 오류 종류에 상관없이 오류가 발생하면 except 블록을 수행한다
try :
except 발생오류 :
try :
except 발생오류 as 오류 메시지 변수 :
예를 들어
try : 4/0
except ZeroDivsionError as e : print(e)
라고 쓰고 실행하면 division by zero라고 나온다
try문에는 finally절을 사용할 수 있다
finally절은 try문 수행 도중 예외 발생 여부에 상관없이 항상 수행된다
보통 finally절은 사용한 리소스를 close해야 할 떄 많이 사용한다이 사용한다
아 JAVA에서 try-catch-finally 이거구나
try문 안에서 여러 개의 오류를 처리하기 위해 다음 구문을 사용한다
try :
except :
except :
근데 이렇게 쓰기 귀찮다보니, 함께 처리할 수 있는데
except('error', 'error') as e : 이렇게 에러 문구를 묶어주는 것이다
또한 try문에 else를 이용할 수 있는데
try :
except
else:
if
else
이런식으로 사용할 수 있다
except에 pass 쓰면 됨
raise 에러문구 <- 이렇게 쓴다
종종 특수한 경우에만 예외 처리를 하기 위해, 종종 만든다고..한다
class MyError(Exception) :
pass
def say_nick(nick) :
if nick == '바보' :
raise MyError()
print(nick)
say_nick('천사')
say_nick('바보')
이렇게 하면 천사가 출력되고 에러가 발생하는데 main.MyError 라고 쓰여 있다
그래서 오류가 안나게 하기 위해 try,except를 쓸거다래서 오류가 안나게 하기 위해 try,except를 쓸거다
class MyError(Exception) :
pass
def say_nick(nick) :
if nick == '바보' :
raise MyError()
print(nick)
try:
say_nick('천사')
say_nick('바보')
except MyError :
print('허용안된별명')
이렇게되면 바보일 때 허용안된 별명이라는 문구가 뜬다
class MyError(Exception) :
pass
def say_nick(nick) :
if nick == '바보' :
raise MyError()
print(nick)
try:
say_nick('천사')
say_nick('바보')
except MyError as e:
print(e)
근데 이렇게 as e라고 쓰면 아무것도 안 뜨는데, 그럴 경우 class에서 str 메서드를 구현해야 한다
class MyError(Exception) :
def str(self) :
return "허용 ㄴㄴ"
def say_nick(nick) :
if nick == '바보' :
raise MyError()
print(nick)
try:
say_nick('천사')
say_nick('바보')
except MyError as e:
print(e)
str 메서드는 print(e)처럼 오류 메시지를 print문으로 출력할 경우 호출되는 메서드이다