본문 바로가기

Python Basic/혼공파

[혼공파] Chapter 06 예외 처리


  • 는 개념 정리
  •  개인적으로 새롭게 알게 된 점 

6-1. 구문 오류와 예외

오류의 종류

프로그래밍 언어의 오류(error)에는 크게 두 가지 종류가 있음. 

  • 구문 오류 (syntax error): 프로그램 실행 전에 발생하는 오류
  • 예외 (exception) 또는 런타임 오류 (runtime error): 프로그램 실행 중에 발생하는 오류

구문 오류 (syntax error)

  • 괄호의 개수, 들여쓰기 문제 등으로 인해 프로그램이 실행되기도 전에 발생하는 오류

syntax error

  • EOL: End Of Line 에 문제가 있다는 뜻. 

예외 (exception) & 런타임 에러 (runtime error)

  • 프로그램 실행 중에 발생하는 오류

exception

예외 처리

예외를 해결하는 모든 것예외 처리 (exception handling) 라고 함. 예외를 처리하는 방법은 다음 두 가지로 나뉨.

다만, 구문 오류는 프로그램이 실행조차 되지 않았기 때문에 예외 처리 방법으로 처리할 수 없음. 문법적인 문제가 발생한 코드를 수정해 줘야 함.  

  • 조건문을 사용하는 방법
  • try 구문을 사용하는 방법

1. 조건문을 사용하는 방법

=> 발생할 수 있는 예외 상황은?

  • 만약 정수를 입력하지 않는다면? -> 예외 발생. 

예외 발생

=> 조건문으로 예외 처리하기

2. try 구문을 사용하는 방법

try 구문

  • try except 구문과 pass 키워드 조합
    • 프로그래밍을 하다보면, 이유는 정확히 모르겠지만, 어떤 부분에서 예외가 발생하는지 정도는 파악할 수 있는 상황이 있음. 예외가 발생하면 일단 처리해야 하지만, 해당 코드가 딱히 중요한 부분이 아니라면 일단 프로그램이 강제 종료되는 것부터 막자는 목적으로 except 구문에 아무 것도 넣지 않고, try 구문을 사용함. 
    • 하지만 구문 내부에 아무 것도 넣지 않으면 구문 오류가 발생함으로, pass 키워드를 넣음. 
try:
    예외가 발생할 가능성이 있는 코드
    
except:
    pass

 

  • 다른 프로그래밍 언어는 예외 처리에 else 구문이 없음. 예외 처리에 else 구문이 있는 프로그래밍 언어는 파이썬과 루비 정도. 선호하는 방법으로 사용해도 됨. 
  • try except 구문은 if 구문을 활용하는 코드에 비해 아주 약간 느림. 그러나 코드를 조금 더 쉽게 작성할 목적이라면, 사용해도 괜찮다고 생각함.

* 규칙 *

  1. try 구문은 단독으로 사용할 수 없으며, 반드시 except 구문 또는 finally 구문과 함께 사용해야 함. 
  2. else 구문은 반드시 execpt 구문 뒤에 사용해야 함. 
  3. 아래 5가지 조합 이외는 구문 오류가 발생. 
    • try + except
    • try + except + else
    • try + except + finally
    • try + except + else + finally
    • try + fianlly

* finally *

일반적으로 finally 키워드를 설명하는 예제로 '파일 처리'를 많이 사용함. 

 

파일을 열고 있으면, 해당 파일을 이동하거나 덮어 씌우는 것이 불가능. 따라서 프로그램에 파일을 열었으면 (open), 반드시 닫아야 (close) 함. 파일을 닫을 때는 close() 함수를 사용하는데, 중간 과정에서 예외가 발생해서 try 구문 중간에 튕겨 버리면 파일이 제대로 닫히지 않는 문제가 발생할 수 있음.

 

6-2. 예외 고급

  • 프로그래밍에서 예외가 발생하면
  • 예외 정보가 생기고
  • 예외 정보는 예외 객체에 저장됨.

어떤 코드의 내부에서는 여러 개의 예외가 발생할 수 있음. 

파이썬은 이 때 예외들을 구분해서 처리할 수 있도록 하는 구문을 제공함. 

  • 예외를 구분할 때, except 구문 뒤에 예외의 종류를 입력함. 

CODE

try:
    예외가 발생할 가능성이 있는 구문
    
except 예외 종류 A:
    예외 A가 발생했을 때 실행할 구문
    
except 예외 종류 B:
    예외 B가 발생했을 때 실행할 구문
    
except 예외 종류 C:
    예외 C가 발생했을 때 실행할 구문

 

그리고 except 구문 뒤에 예외 객체를 붙여 활용할 수 있음. 

exception

* 모든 예외 잡기 *

  • 예상하지 못한 예외를 처리하기 위해서 Exception 사용.
    • Exception: 모든 예외의 어머니 (Exception은 클래스임, 8장에서 다룸)
    • else 구문 처럼, Exception을 넣어서 프로그램이 죽지 않게 하는 것이 좋음. 
    • 참고로, 너무 치명적인 문제인데도 프로그램이 종료되지 않게 만들면, 그 나름대로 문제가 될 수 있으므로 상황을 꼭 확인해야 함. 

exception

raise 키워드

프로그램이 강제 종료되는 것을 막기 위해 예외는 꼭 처리해야 함. 

하지만, 프로그램을 개발하는 동안, '아직 구현하지 않은 부분이니까 확실하게 문제가 생기게 만들자'는 경우도 있음. 

 

raise 키워드를 사용해 예외를 강제로 발생시키는 기능을 함. 

  • raise 키워드 뒤에 예외 이름을 입력하면, 일부로 예외를 발생시켜 프로그램을 다운시킴.

raise 키워드