Python Basics - Exceptions

Jayson Hwang·2022년 5월 2일
0

19. Exceptions(예외처리)

  • 오류를 무시해야하는 때, try, except를 사용하여 예외적으로 오류를 처리 가능

19-1. 오류가 발생하는 이유?

  • 디렉터리 안에 없는 파일을 열려고 시도했을 때 (FileNotFoundError)
>>> f = open("나없는파일", 'r')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '나없는파일'

>>> FileNotFoundError 오류 발생
  • 0으로 다른 숫자를 나누는 경우 (ZeroDivisionError)
>>> 4 / 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero

>> ZeroDivisionError 오류 발생
  • 리스트에서 없는 값을 얻으려 하는 경우(IndexError)
>>> a = [1,2,3]
>>> a[4]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

>> IndexError


19-2. 오류 예외 처리 기법

📌 ::: try, except

try:
    ...
except [발생 오류[as 오류 메시지 변수]]:
    ...

try 블록 수행 중 오류가 발생하면 except 블록수행
➣ 하지만, try 블록에서 오류가 발생하지 않는다면 except 블록은 수행되지 않는다.


📌📌 ::: except 구문
except [발생 오류 [as 오류 메시지 변수]]:

위 구문을 보면 [ ] 기호를 사용하는데, 이 기호는 괄호 안의 내용을 생략할 수 있다는 관례 표기법이다. 즉 except 구문은 다음 3가지 방법으로 사용할 수 있다.

  1. try, except만 쓰는 방법
  • 오류종류에 상관없이 오류가 발생하면 except 블록 수행
try:
    ...
except:
    ...
  1. 발생 오류만 포함한 except
  • 오류가 발생했을 때 except문에 미리 정해놓은 오류 이름과 일치할 때만 except 블록 수행
try:
    ...
except 발생 오류:
    ...
  1. 발생 오류와 오류 메시지 변수까지 포함한 except
  • 두 번쨰 경우에서 오류 메세지의 내용까지 알고 싶을 때 사용하는 방법
try:
    ...
except 발생 오류 as 오류 메시지 변수:
    ...
try:
    4 / 0
except ZeroDivisionError as e:
    print(e)

> 위처럼 40으로 나누려고 하면 ZeroDivisionError가 발생하여 
> except 블록이 실행되고 변수 e에 담기는 오류 메시지를 다음과 같이 출력한다.

>> 결과값: division by zero

📌 ::: try, finally

  • finally 절은 try문 수행 도중 예외 발생 여부에 상관없이 항상 수행
  • 보통 finally 절은 사용한 리소스를 close해야 할 때 사용
f = open('foo.txt', 'w')
try:
    # 무언가를 수행한다.
finally:
    f.close()

>> foo.txt 파일을 쓰기 모드로 연 후에 try문을 수행한 후
>> 예외 발생 여부와 상관없이 finally절에서 f.close()로 열린 파일을 닫을 수 있다.

📌 ::: 여러개 오류 처리하기

try:
    ...
except 발생 오류1:
   ... 
except 발생 오류2:
   ...
try:
    a = [1,2]
    print(a[3])
    4/0
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")
except IndexError:
    print("인덱싱 할 수 없습니다.")
    
>> a는 2개의 요솟값을 가지고 있기 때문에 a[3]는 IndexError를 발생시키므로
>> "인덱싱할 수 없습니다."라는 문자열이 출력될 것이다.
>> 인덱싱 오류가 먼저 발생했으므로 4/0으로 발생되는 ZeroDivisionError 오류는 발생하지 않았다.


<<동일하지만 'as'를 사용하여 표현>>
try:
    a = [1,2]
    print(a[3])
    4/0
except ZeroDivisionError as e:
    print(e)
except IndexError as e:
    print(e)
  • 두가지 오류(ZeroDivisionError & IndexError)를 함께 처리 가능
try:
    a = [1,2]
    print(a[3])
    4/0
except (ZeroDivisionError, IndexError) as e:
    print(e)

📌 ::: try 문에 else 문 사용

  • Else문은 exception이 발생하지 않았을 때 실행
try:
    ...
except [발생 오류[as 오류 메시지 변수]]:
    ...
else:  # 오류가 없을 경우에만 수행된다.
    ...
    
    
>> try문 수행중 오류가 발생하면 except절이 수행되고 오류가 없으면 else절이 수행된다.
try:
    age=int(input('나이를 입력하세요: '))
except:
    print('입력이 정확하지 않습니다.')
else:
    if age <= 18:
        print('미성년자는 출입금지입니다.')
    else:
        print('환영합니다.')
        
        
>> 만약 '나이를 입력하세요:' 라는 질문에 숫자가 아닌 다른 값을 입력하면 오류가 발생하여
>> '입력이 정확하지 않습니다.'라는 문장을 출력한다. 오류가 없을 경우에만 else절이 수행된다.


REFERENCE

https://wikidocs.net/30 :: 점프 투 파이썬

profile
"Your goals, Minus your doubts, Equal your reality"

0개의 댓글