i) 디렉터리 안에 파일을 열려고 시도할 때 발생하는 오류(FileNotFoundError)
>>> f = open("나없는파일", 'r')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '나없는파일'
ii) 0으로 다른 숫자를 나누는 경우 생각(ZeroDivisionError)
>>> 4 / 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
iii) 얻을 수 없는 값 제시(IndexError)
>>> a = [1,2,3]
>>> a[4]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
try 블록 수행 중 오류가 발생하면 except블록 수행.
try 블록 수행 중 오류 발생 안하면 except 블록 수행 안함1
# 구조
try:
...
except [발생 오류[as 오류 메시지 변수]]:
...
i) try, except만 쓰기
try:
...
except:
ii) 발생 오류만 포함한 except문
try:
...
except 발생 오류:
...
iii) 발생 오류와 오류 메시지 변수까지 포함한 except문
try:
...
except 발생 오류 as 오류 메시지 변수:
...
try문 finally절 사용.
finally절은 try문 수행 도중 예외 발생 여부에 상관없이 항상 수행
finally절은 사용한 리소스 close해야 많이 사용
예시
f = open('foo.txt', 'w')
try:
# 무언가를 수행한다.
finally:
f.close()
try:
...
except 발생 오류1:
...
except 발생 오류2:
...
0으로 나누는 오류와 인덱싱 오류 처리
2개 이상의 오류를 동일하게 처리(괄호 사용하여 묶어 처리)
try:
a = [1,2]
print(a[3])
4/0
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
except IndexError:
print("인덱싱 할 수 없습니다.")
try:
...
except [발생 오류[as 오류 메시지 변수]]:
...
else: # 오류가 없을 경우에만 수행된다.
...
*예시
try:
age=int(input('나이를 입력하세요: '))
except:
print('입력이 정확하지 않습니다.')
else:
if age <= 18:
print('미성년자는 출입금지입니다.')
else:
print('환영합니다.')
try:
f = open("나없는파일", 'r')
except FileNotFoundError:
pass # 오류 회피
raise 명령어를 사용하여 오류 강제 발생
자식 클래스가 함수 강제 구현
class Bird:
def fly(self):
raise NotImplementedError
fly함수 구현 안함
NotImplemented Error 발생
class Eagle(Bird):
pass
eagle = Eagle()
eagle.fly()
*메서드 오버라이딩 : 상속받는 클래스에서 함수를 재구현하는 것
Traceback (most recent call last):
File "...", line 33, in <module>
eagle.fly()
File "...", line 26, in fly
raise NotImplementedError
NotImplementedError
*에러 안 뜬다
class Eagle(Bird):
def fly(self):
print("very fast")
eagle = Eagle()
eagle.fly() # very fast
class MyError(Exception):
pass
*별명 출력 함수
def say_nick(nick):
if nick == '바보':
raise MyError()
print(nick)
say_nick("천사")
say_nick("바보")
천사
Traceback (most recent call last):
File "...", line 11, in <module>
say_nick("바보")
File "...", line 7, in say_nick
raise MyError()
__main__.MyError # 천사 출력 후 MyError 발생한다.
*예외처리 기법 사용하여 MyError 발생
try:
say_nick("천사")
say_nick("바보")
except MyError:
print("허용되지 않는 별명입니다.")
# 결과
천사
허용되지 않는 별명입니다.
*오류 메시지 사용
try:
say_nick("천사")
say_nick("바보")
except MyError as e:
print(e) # 오류 메시지 출력 되지 않는다
#__str__메서드 이용해야 오류 메시지 출력
class MyError(Exception):
def __str__(self):
return "허용되지 않는 별명입니다."