파이썬에서 정해진 예외가 아니라 직접 예외를 발생시킬 수 있다.
raise로 예외를 발생시키면 raise아래에 있는 코드는 실행되지 않고 바로 except로 넘어간다.
Exception
대신 RuntimeError
, NotImplementedError
등 다른 예외를 사용해도 된다.
raise 예외('에러메시지')
try:
x = int(input('3의 배수를 입력하세요'))
if x % 3 != 0:
raise Exception('3의 배수가 아닙니다.')
print(x)
except Exception as e:
print('예외가 발생했습니다.', e)
except 안에서 raise를 사용하면 현재 예외를 다시 발생시킨다.
def three_multiple():
try:
x = int(input('3의 배수를 입력하세요: '))
if x % 3 != 0: # x가 3의 배수가 아니면
raise Exception('3의 배수가 아닙니다.') # 예외를 발생시킴
print(x)
except Exception as e: # 함수 안에서 예외를 처리함
print('three_multiple 함수에서 예외가 발생했습니다.', e)
raise # raise로 현재 예외를 다시 발생시켜서 상위 코드 블록으로 넘김
try:
three_multiple()
except Exception as e: # 하위 코드 블록에서 예외가 발생해도 실행됨
print('스크립트 파일에서 예외가 발생했습니다.', e)
raise에 다른 예외를 지정하고 에러 메시지를 넣을 수도 있다.
if x % 3 != 0:
raise Exception('3의 배수가 아닙니다.')
print(x)
except Exception as e:
print('three_multiple 함수에서 예외가 발생했습니다.', e)
raise RuntimeError('three_multiple 함수에서 예외가 발생했습니다.')
assert 조건식
assert 조건식, 에러메시지
형태로 작성하며, 조건식이 거짓일 때 AssertionError 예외를 발생시키고, 조건식이 참이면 그냥 넘어간다.
디버깅 모드에서만 실행되며, 파이썬은 기본적으로 디버깅 모드이다.
x = int(input('3의 배수를 입력하세요: '))
assert x % 3 == 0, '3의 배수가 아닙니다.' # 3의 배수가 아니면 예외 발생, 3의 배수이면 그냥 넘어감
print(x)
class NotThreeMultipleError(Exception): # Exception을 상속받아서 새로운 예외를 만듦
def __init__(self):
super().__init__('3의 배수가 아닙니다.')
def three_multiple():
try:
x = int(input('3의 배수를 입력하세요: '))
if x % 3 != 0: # x가 3의 배수가 아니면
raise NotThreeMultipleError # NotThreeMultipleError 예외를 발생시킴
print(x)
except Exception as e:
print('예외가 발생했습니다.', e)
클래스를 구현하지 않고, 예외 발생시킬때 메시지를 넣어줄 수도 있다.
class NotThreeMultipleError(Exception): # Exception만 상속받고
pass # 아무것도 구현하지 않음
def three_multiple():
try:
x = int(input('3의 배수를 입력하세요: '))
if x % 3 != 0: # x가 3의 배수가 아니면
raise NotThreeMultipleError('3의 배수가 아닙니다.') # NotThreeMultipleError 예외를 발생시킴
print(x)
except Exception as e:
print('예외가 발생했습니다.', e)