Welcome! Everything is fine.

[혼공단 5주차] 혼자 공부하는 파이썬 Chapter 06 ~ 07-1 본문

자격증 및 기타 활동/한빛미디어 혼공단

[혼공단 5주차] 혼자 공부하는 파이썬 Chapter 06 ~ 07-1

개발곰발 2021. 8. 8.
728x90

💡 용어 정리

✔ 예외 처리 : 예외를 해결하는 것. 조건문을 사용하는 방법과 try 구문을 사용하는 방법이 있다.

✔ 기본 예외 처리 : 조건문 등을 사용해 예외를 처리하는 기본적인 방법.

✔ 예외 객체 : 예외와 관련된 정보를 담고 있는객체.

✔ raise : 예외를 강제로 발생시키는 기능을 하는 키워드.

💡 구문 오류와 예외

프로그래밍 언어에서 오류(error)에는 두 가지 종류가 있다. 프로그램이 실행되기 전에 발생하는 구문 오류는 괄호의 개수, 들여쓰기 문제 등으로 발생하기 때문에 문법적인 문제를 해결해야한다. 프로그램 실행 중에 발생하는 예외 혹은 런타임 오류 역시 코드를 제대로 수정하여 해결한다. 그러나 이러한 예외를 해결하는 방법에는 단순히 코드를 고치는 것 외에 더 복잡한 것들이 있다.

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

예외처리

예외를 해결하는 것을 예외 처리(exception handling)라고 부르며, 예외 처리 방법에는 크게 두 가지가 있다.

  • 조건문을 사용하는 방법 → 기본 예외 처리
  • try 구문을 사용하는 방법 → try except 구문, try except else 구문, finally 구문 등

조건문을 사용한 기본 예외 처리

아래는 책에 나온 간단한 예시다. 사용자로부터 정수를 입력받아서 원의 반지름, 둘레, 넓이를 구하는 프로그램이다. if - else 문을 이용하여 사용자가 정수를 입력하지 않을 예외를 피한다. 문자열의 isdigit( ) 함수를 이용하여 숫자로만 구성된 글자일 경우에만 int( ) 함수를 이용해 정수로 변환한다. 숫자로만 구성되었다면 제대로 된 결과가 나오고, 그렇지 않으면 "정수를 입력하지 않았습니다"라는 문장이 나오도록 짠 코드다.

user_input_a = input("정수 입력 > ")

if user_input_a.isdigit():
    number_input_a = int(user_input_a)
    print("원의 반지름 :", number_input_a)
    print("원의 둘레 :", 2 * 3.14 * number_input_a)
    print("원의 넓이 :", 3.14 * number_input_a * number_input_a)
else:
    print("정수를 입력하지 않았습니다.")

try except  / try except else / finally 구문

예외를 다 조건문으로만 처리하기에는 무리가 있다. 그러므로 프로그래밍 언어가 예외를 처리할 수 있는 구문을 따로 제공하는데, 그것이 try except 구문이다. 위의 예시를 try except 문으로 수정하면 아래와 같다.

try:
    number_input_a = int(input("정수 입력 > "))
    print("원의 반지름 :", number_input_a)
    print("원의 둘레 :", 2 * 3.14 * number_input_a)
    print("원의 넓이 :", 3.14 * number_input_a * number_input_a)

except:
    print("정수를 입력하지 않았습니다.")

 

위의 코드를 try except else 문으로 바꾸어 '예외가 발생하지 않았을 때 실행할 코드'를 지정할 수 있다.

try:
    number_input_a = int(input("정수 입력 > "))
except:
    print("정수를 입력하지 않았습니다.")
else:
    print("원의 반지름 :", number_input_a)
    print("원의 둘레 :", 2 * 3.14 * number_input_a)
    print("원의 넓이 :", 3.14 * number_input_a * number_input_a)

그러나 예외처리에 else 구문이 있는 프로그래밍 언어는 파이썬과 루비정도이기 때문에 간단히 이해만 하고 넘어가고, 편한 대로 사용하는 것이 좋다.

finally 구문은 예외 처리 구문에서 가장 마지막에 사용할 수 있는 구문이다. 필요에 따라 예외 발생 여부에 관계 없이 무조건 실행할 때 사용한다. 반복문에서 break로 try구문 전체를 빠져나가도 finally 구문은 실행된다. 

try:
    예외가 발생할 가능성이 있는 코드
except:
    예외가 발생했을 때 실행할 코드
else:
    예외가 발생하지 않았을 때 실행할 코드
finally:
    무조건 실행할 코드

💡 예외 고급

예외 객체

예외가 발생하면 예외와 관련된 정보가 생긴다. 그리고 이런 정보는 예외 객체에 저장된다. 여기서 '예외의 종류'를 모른다면 Exception을 사용한다. 

try:
	예외가 발생할 가능성이 있는 구문
except 예외의 종류 as 예외 객체를 활용할 변수명:
	예외가 발생했을 때 실행 할 구문

또한 예외 객체를 사용하여 예외를 구분할 수 있다. (ValueError, IndexError 등) 예외를 구분할 때는 except 뒤에 예외의 종류를 바로 적어주어도 되고, as 키워드로 예외 객체를 붙여 사용할 수도 있다. 그리고 마지막에는 Exception을 넣어서 프로그램이 죽지 않도록 하는 것이 좋다. 아래 코드는 예외 구분과 Exception을 활용하여 모든 예외를 잡은 코드다.

list_number = [52, 254, 34, 78, 101]

try:
    num_input = int(input("정수 입력 > "))
    print("{}번째 요소 : {}".format(num_input, list_number[num_input]))
    예외.발생해주세요()
except ValueError as exception:
    print("정수를 입력해주세요!")
    print(type(exception), exception)
except IndexError as exception:
    print("리스트의 인덱스를 벗어났어요!")
    print(type(exception), exception)
except Exception as exception:
    print("미리 파악하지 못한 예외가 발생했습니다.")
    print(type(exception), exception)

 

raise 구문

raise 키워드는 아직 구현하지 않은 부분에서 일부러 예외를 발생시키는 키워드다. raise 뒤에 예외 이름을 적어주면 된다.

raise 예외 객체

✅ 기본 미션

  • 구문 오류 : 프로그램 실행 전에 발생해 아예 프로그램이 실행되지 않으며, 코드의 문법적인 문제가 원인이다.
  • 예외 : 프로그램 실행은 되지만 그 중간에 발생하는 오류로, 코드 자체에 문법적인 오류는 없다. if문, try except문 등과 같은 예외처리를 통하여 해결할 수 있다.

✅ 선택 미션