점프 투 파이썬 참고: https://wikidocs.net/30
오류 나면 프로그램이 멈추는데 예외 처리 하면 안 멈추고 밑에 코드도 실행된다.
파이썬은 try, except를 사용해서 예외적으로 오류를 처리할 수 있게 해준다.
try:
#오류가 발생할 수 있는 구문
except Exception as e: ⬅️ 오류가 발생했을 때
#오류 발생
else: ⬅️ 오류가 발생하지 않았을 때
#오류 발생하지 않음
finally:
#무조건 마지막에 실행
🔷 디렉터리 안에 없는 파일을 열려고 시도했을 때
없는 파일을 열려고 시도하면 FileNotFoundError
오류가 발생한다.
🔷 0으로 다른 숫자를 나누는 경우
0으로 나누려고 하면 ZeroDivisionError
오류가 발생한다.
🔷 리스트에 없는 값을 호출했을 때
IndexError
오류가 발생한다.
try, except문의 기본 구조
try:
...
except [발생 오류 [as 오류 메시지 변수]]: 👈 괄호는 생략가능
...
try 블록 수행 중 오류가 발생하면 except 블록이 수행된다.
try 블록에서 오류가 발생하지 않는다면 except 블록은 수행되지 않는다.
except 구문의 [ ] 괄호 안의 내용은 생략할 수 있다.
🔷 1. try, except만 쓰는 방법
try:
...
except:
...
오류 종류에 상관없이 오류가 발생하면 except 블록 수행
🔷 2. 발생 오류만 포함한 except문
try:
...
except 발생 오류:
...
오류가 발생했을 때 except문에 미리 정해 놓은 오류 이름과 일치할 때만
except 블록을 수행
🔷 3. 발생 오류와 오류 메시지 변수까지 포함한 except문
try:
...
except 발생 오류 as 오류 메시지 변수:
...
두 번째 경우에서 오류 메시지의 내용까지 알고 싶을 때 사용하는 방법
try:
4 / 0 ⬅️ 0으로 나누면 에러 남
except ZeroDivisionError as e: ⬅️ 에러 내용이 변수e에 담긴다
print(e) ⬅️ 에러 내용 출력
👉 division by zero
try:
f = open('none', 'r')
except FileNotFoundError as e: ⬅️ try문이 오류가 났을 때 실행
print(str(e))
else: ⬅️ try문이 오류가 안 나고 성공했을 때 실행
data = f.read()
print(data)
f.close()
try문에는 finally절을 사용할 수 있다.
finally절은 try문 예외 발생 여부에 상관 없이 항상 수행된다.
사용한 리소스를 close할 때 많이 사용
f = open('foo.txt', 'w')
try:
# 무언가를 수행한다.
finally:
f.close()
f = open('foo.txt', 'w')
try: ⬅️ 오류 날 수 있는 걸 시도하는 거
# 무언가를 수행한다.
data = f.read()
print(data)
except Exception as e: ⬅️ 오류 났을 때 내용 담는 거
print(e)
finally: ⬅️ 오류 여부 상관 없이 무조건 실행하는 거
f.close()
try문 안에서 여러 개의 오류를 처리하기 위해 다음 구문을 사용
🔹 각 오류마다 다르게 처리하고 싶을 때
try:
...
except 발생 오류1:
...
except 발생 오류2:
...
🔹 오류를 동일하게 처리하고 싶을 때
괄호( )를 사용하여 묶어서 처리
try:
a = [1,2]
print(a[3])
4/0
except (ZeroDivisionError, IndexError) as e: ⬅️ 괄호로 묶는다
print(e)
오류가 발생해도 그냥 지나가라
프로그래밍을 하다 보면 특정 오류가 발생할 경우 그냥 통과시켜야 할 때가 있다.
try:
...
except 발생 오류1:
pass
pass
를 사용하여 오류를 그냥 회피하도록 작성한다.
try:
f = open("내가없는파일", 'r')
except FileNotFoundError: ⬅️ 이 오류가 발생했을 때 그냥 지나가겠다
pass
프로그래밍을 하다 보면 종종 오류를 일부러 발생시켜야 할 경우도 생긴다.
raise
명령어를 사용해 오류를 강제로 발생시킬 수 있다.
class Bird:
def fly(self):
raise NotImplementedError ⬅️ 오류 발생하게 해놓음. 오버라이딩 해야 됨
class Eagle(Bird):
def fly(self):
print("very fast") ⬅️ 오류 없애기 위해 오버라이딩 함
eagle = Eagle()
eagle.fly()
👉 very fast
raise NotImplementedError
때문에 수정 안 하면 그대로 오류가 발생.
오류가 발생하지 않도록 하기 위해서 fly 함수를 수정 해줘야 함.
fly 함수 변형해서 쓰라고 강제하는 것
프로그램 수행 도중 특수한 경우에만 예외 처리를 하기 위해서
예외를 만들어서 사용한다.
예외는 파이썬 내장 클래스인 Exception
클래스를 상속하여 만들 수 있다.
📕 Exception 클래스
모든 오류의 최상위 부모
무슨 오류 날 지 모르겠을 때 Exception 쓰면 됨
모든 오류 다 잡아낼 수 있음
__str__
메서드는 print(e)처럼 오류 메시지를 print문으로 출력
class MyError(Exception): ⬅️ Exception 클래스 상속
def __str__(self): ⬅️ __str__ 메서드 사용
return "허용되지 않는 별명입니다."
def say_nick(nick):
if nick == '바보':
raise MyError()
print(nick)
try:
say_nick('천사')
say_nick('바보')
except MyError as e:
print(e)
👉
천사
허용되지 않는 별명입니다.