1 예외
- 소프트웨어적으로 문법적인 문제는 없으나 실행 중에 발생하는 예상하지 못한 문제. (vs 에러: 소프트웨어적으로 처리할 수 없는 문제. 즉, 실행이 불가능하고 컴파일 중에 주로 발생.)
ex) a/b에서 b=0이면 예외
a가 define되지 않았는데 a/b는 에러
- 예외 관련 클래스는 Exception 클래스를 상속한다.
- BaseException: 모든 예외의 최상위 부모 클래스
- Exception: 모든 일반적인 예외의 부모 클래스
- ArithmetricError: 산술 연산 관련 에러
- ZeroDivisionError: 0으로 나눴을 때
- OSError: 시스템 관련 에러(파일 시스템, 네트워크 연결, 운영 체제 등)
- FileNotFoundError: open을 하는 파일이 없을
- LookupError: 인덱싱 또는 키 검색 관련 에러
- SyntaxError: 구문 에러
- IndentationError: 코드 들여쓰기가 올바르지 않을 때
- ValueError: int('str')처럼 올바르지 않은 값이 들어갈 때
2 예외 처리
- 예외가 전체 프로그램 실행에 영향이 없도록 처리.
ex) 프로그램1 - 프로그램2 - 프로그램3 이 있을 때, 1에서 예외 발생시 나머지가 다 실행 안되는데, 별도 처리하고 2, 3은 실행되도록
try: 이 블록을 먼저 수행
except: 에러가 발생하면, try문 중단하고 except문 실행. 무슨 에러든 실행. 만약 에러 발생 안하면 실행 안됨.
except ZeroDivisionError: 이렇게 오류 이름 명시할 경우, 지정한 오류가 발생했을 때만 여기로.
except ZeroDivisionError as e: 이렇게 해서 e를 아래 구문에 이용 가능
except ZeroDivisionError:
pass
except ValueError:
pass
except (ZeroDivisionError, ValueError):
else: try에서 에러가 없는 경우(except문이 시행되지 않았을 때) 시행
finally: try에서 에러가 있든 없든(except문이 시행되든 아니든) 항상 실행
2-1 pass, raise
pass: 오류 발생시 그냥 통과할 때 씀
raise: 예외 강제로 발생.
class Bird:
def fly(self):
raise NotImplementedError
class Eagle(Bird):
pass
eagle = Eagle()
eagle.fly()
이렇게 NotImplementedError로 작성 부분이 구현되지 않으면
일부러 오류 발생시키는 것.
Eagle 클래스에서 fly 기능을 오버라이딩하지 않고서,
agle.fly()를 하면 NotImplementedError 발생.
def calculate(n1, n2):
if n2! = 0:
print(n1/n2)
else:
raise Exception('0으로 나눌 수 없습니다.')
try:
calculate(10, 0)
except Exception as e:
print(f'Exception: {e}) => 0으로 나눌 수 없습니다 출력
def sendSMS(msg):
if len(msg) > 10:
raise Exception('MMS 전환 후 발송', 1) => 배열로 온다. 각각 Exception.args[0], [1]
else:
print('SMS')
def sendMMS(msg):
if len(msg) <= 10:
raise Exception('SMS 전환 후 발송', 2)
else:
print('MMS')
try:
sendSMS(msg) => sms로 먼저 실행. 10보다 길면 위의 에러 발생.
except Exception as e:
print(f'e: {e.args[0]}') => 'MMS 전환 후 발송' 출럭
print(f'e: {e.args[1]}') => '1' 출력
if e.args[1] == 1: => 10보다 길어서 에러.args[1]이 1이면 MMS로 넘어감
sendMMS(msg)
if e.args[1] == 2: => 10보다 짧아서 에러.args[1]이 2이면 SMS로 넘어감
sendSMS(msg)
3 Exception 클래스 만들기
- Exception 클래스를 상속해서 사용자 예외 클래스 만들기
class UserException(Exception)
def __init__(self, n):
super.__init__(f'{n}은 사용할 수 없습니다.')
class MyError(Exception):
def __str__(self): => 객체를 호출하면 문자열을 반환하는 메서드. 일반적으로 그냥 객체를 호출하면 주소를 반환하는데, 아래 문자열을 반환.
return '허용되지 않는 별명입니다.'