* try
try:
...
except [발생 오류[as 오류 메시지 변수]]:
...
else: # 오류 발생하지 않은 경우 실행 (try가 참값일 때)
...
finally: # 무조건 마지막에 실행
- 여기서 [ ] 기호는 괄호 안의 내용을 생략할 수 있다는 관례 표기법이다.
- except 발생 오류: 는 오류가 발생했을 때 except문에 미리 정해 놓은 오류 이름과 일치할 때만 except 블록을 수행한다는 뜻이다.
- except 발생 오류 as 오류 메시지 변수: 는 오류메시지의 냉요을 알고 싶을 때, 발생오류를 지정한 오류 메시지 변수에 담는 것이다.
try:
4/0
except ZeroDivisionError as e:
print(e)
-----------------------------------
division by zero
- 발생 오류에 에러코드 이름을 모를 때 Exception를 적어두면 Exception이 대부분의 에러코드를 다 포함하므로 오류 발생시 except을 실행할 수 있게 해준다.
f = open('foo.txt', 'w')
try:
# 무언가를 수행한다.
finally:
f.close()
- 예외 발생 여부와 상관없이 finally 절에서 f.close()로 열린 파일을 닫는다.
* 오류 회피하기
try:
f=open("나없는파일", 'r')
except Exception:
pass
- pass를 사용하여 오류를 회피하도록 작성할 수도 있다.
*오류 일부러 발생시키기
- raise 명령어는 오류를 일부러 발생시킨다. 부모클래스를 변형해서 사용하게끔 강제하고 싶을 때, 변형하지 않고 사용하면 오류를 출력하게 만들 때 사용한다.
class Bird: #부모클래스
def fly(self):
raise NotImplementedError
class Eagle(Bird): #자식클래스
pass
* 예외 직접 만들기
- 프로그램 수행 도중 특수한 경우에만 예외 처리를 하기 위해서 예외를 만들어서 사용할 때 유용하다.
- 파이썬 내장 클래스인 Exception 클래스를 상속하여 만들 수 있다.
class MyError (Exception):
pass
def say_nickname(nick):
if nick == '바보':
raise MyError()
print(nick)
try:
say_nickname("천재")
say_nickname("바보")
except MyError:
print("허용되지 않는 별명입니다.")
---------------------------------------
천재
허용되지 않는 별명입니다.
- 위와 같은 코드를 아래처럼 오류 메시지를 사용하여 만들 수도 있다.
class MyError (Exception):
def __str__(self):
return "허용되지 않는 별명입니다."
def say_nickname(nick):
if nick == '바보':
raise MyError()
print(nick)
try:
say_nickname("천재")
say_nickname("바보")
except MyError as e:
print(e)
---------------------------------------
천재
허용되지 않는 별명입니다.
- _ _ str_ _ 메서드는 오류 메시지를 print문으로 출력할 경우에 호출되는 메서드이다.