우수 혼공단 선정 너무 기뻐요!! ❤️

벌써 혼공단 활동도 절반을 넘어서 끝이 다가오네요... 시간이 너무 빨리 흐르는 것 같습니당 ㅎㅎ

이번 주도 열심히 공부 해 보겠습니다! 파이썬 공부 너무 재밌어요 👻😎


Chapter 06. 예외 처리

[구문 오류와 예외]

 

✏️ 구문 오류 (syntax error) : 프로그램이 실행되기 전에 발생하는 오류

  • 괄호나 따옴표 개수, 들여쓰기 등의 문제가 있을 때 발생
  • 해결하지 않으면 프로그램 자체가 실행되지 않으므로, 오류가 발생한 코드를 찾아 수정해야 한다.
# 정상적인 실행
print("Hello World")

# 구문 오류 발생 - 닫는 따옴표가 없음
# 닫는 따옴표 추가해서 해결
print("Hello World)

 

✏️ 예외 (exception) 또는 런타임 오류 (runtime error) : 프로그램 실행 중에 발생하는 오류이며, 구문 오류 해결법처럼 오류가 발생한 코드를 찾아 수정해야 한다.

 

✏️예외 처리 (exception handling) : 예외를 처리하는 모든 것

    ✔️ 구문 오류는 프로그램 실행 전에 발생하기 때문에 예외처리 방법으로 처리할 수 없다.

 

조건문으로 예외 처리하기

    ✔️ 정수를 입력받는 소스 코드에 문자열을 입력한다면 ? 예외 발생!

    ✔️ '정수를 입력하지 않았을 때' 를 조건으로 구분해서, 해당 상황일 때 프로그램이 죽지 않고 정상 종료되도록 한다.

# 조건문으로 예외 처리
input_num = input("정수 입력 > ")

# 사용자 입력이 숫자로만 구성되어 있을 때
if input_num.isdigit():
    number = int(input_num)
    print("입력받은 숫자: ", number)
else:
    print("정수가 입력되지 않았습니다.")

# 정수 입력한 경우
정수 입력 > 5
입력받은 숫자:  5

# 문자열 입력한 경우
정수 입력 > 문자열
정수가 입력되지 않았습니다.

 

try except 구문을 사용하여 예외 처리하기

  • 파이썬에서 제공하는 예외를 처리할 수 있는 구문
  • 어떤 상황에 예외가 발생하는 지 모두 파악하지 않아도 프로그램이 강제로 죽는 상황을 막을 수 있다.
try:
       예외가 발생할 가능성이 있는 코드
except:
       예외가 발생했을 때 실행할 코드
# try except 구문으로 예외 처리
try:
    # 예외가 발생할 가능성이 있는 구문
    input_num = int(input("정수 입력 > "))
    print("입력받은 숫자: ", input_num)
except:
    # 예외 발생 시 실행할 구문
    print("정수가 입력되지 않았습니다.")

# 정수 입력
정수 입력 > 6
입력받은 숫자:  6

# 정수가 아닌 문자열 입력
정수 입력 > 안녕하세요
정수가 입력되지 않았습니다.

 

 try except 구문과 pass 키워드를 조합해서 사용하기

  • try except 구문 사용 시 except 구문에 아무것도 넣지 않으면 구문 오류가 발생하므로, pass 키워드를 추가한다.
try:
       예외가 발생할 가능성이 있는 코드
except:
        pass

 

 try except else 구문

  • try except 구문에 else 구문을 넣으면 '예외가 발생 하지 않았을 때 실행할 코드' 를 지정할 수 있다.
  • 예외가 발생할 가능성이 있는 코드만 try 구문 내부에 넣고, 나머지는 else로 빼는 경우가 많다.
# try except else 구문으로 예외 처리
try:
    # 예외가 발생할 가능성이 있는 구문
    input_num = int(input("정수 입력 > "))
except:
    print("정수가 아닙니다.")
else:
    print("입력받은 숫자: ", input_num)
    
# 정수를 입력한 경우
정수 입력 > 10
입력받은 숫자:  10

# 정수를 입력하지 않은 경우
정수 입력 > hello
정수가 아닙니다.

 

finally 구문

  • 예외 처리 구문에서 가장 마지막에 사용할 수 있는 구문.
  • 예외 발생 여부와 상관 없이 무조건 실행할 때 사용하는 코드
try:
     예외가 발생할 가능성이 있는 코드
except:
      예외가 발생했을 때 실행할 코드
else:
      예외가 발생하지 않았을 때 실행할 코드
finally:
      무조건 실행할 코드
# try except 구문으로 예외 처리
try:
    # 예외가 발생할 가능성이 있는 구문
    input_num = int(input("정수 입력 > "))
    print("입력받은 숫자: ", input_num)
except:
    print("정수가 아닙니다.")
else:
    print("예외가 발생하지 않았습니다.")
finally:
    print("프로그램이 모두 끝났습니다.")
    
# 정수를 입력한 경우
정수 입력 > 10
입력받은 숫자:  10
예외가 발생하지 않았습니다.
프로그램이 모두 끝났습니다.

# 정수를 입력하지 않은 경우
정수 입력 > 테스트
정수가 아닙니다.
프로그램이 모두 끝났습니다.

 

※ try 구문은 단독으로 사용할 수 없고, 반드시 except 구문이나 finally 구문과 함께 사용해야 한다.

else 구문은 반드시 except 구문 뒤에 사용해야 한다.

 

 finally 키워드를 사용해서 코드를 깔끔하게 만들기

  • finally 키워드는 무조건 실행되기 때문에, 반복문이나 함수 내부에서 사용하면 좋다.
  • 예시) 파일 처리 코드
    • try 구문에서 return 키워드로 빠져 나가거나 예외 발생으로 try 구문 중간에 빠져 나가는 경우에 파일이 제대로 닫히지 않는 문제가 발생할 수 있음
    • finally 구문을 활용하여 try 구문을다 수행하지 않고 빠져나가더라도 무조건 파일이 닫히게 할 수 있다.

[예외 고급]

 

✏️ 예외 객체 (exception object) : 프로그램에서 예외가 발생하면 예외와 관련된 정보가 생긴다. 그리고 예외 정보는 예외 객체에 저장된다.

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

 

예외의 종류가 뭔지 모를 땐 Exception 을 사용한다.

# try except 구문으로 예외 처리
try:
    # 예외가 발생할 가능성이 있는 구문
    input_num = int(input("정수 입력 > "))
    print("입력받은 숫자: ", input_num)
except Exception as exception:
	# 예외 객체의 자료형 출력
    print("type(exception): ", type(exception))
    # 예외 객체 출력
    print(exception)
    
# 문자를 입력한 경우 예외 발생
정수 입력 > hi
type(exception):  <class 'ValueError'>
invalid literal for int() with base 10: 'hi'

 

프로그램 실행 중에 여러 개의 예외가 발생할 수 있다. 파이썬에서는 execpt 구문 뒤에 예외의 종류를 입력해서 예외를 구분할 수 있다.

try:
      예외가 발생할 가능성이 있는 구문
except 예외의 종류A:
        예외A가 발생했을 때 실행할 구문
except 예외의 종류B:
        예외B가 발생했을 때 실행할 구문
except 예외의 종류C:
        예외C가 발생했을 때 실행할 구문
list_a = [52, 273, 32, 72, 100]

# try except 구문으로 예외 처리
try:
    # 예외가 발생할 가능성이 있는 구문
    input_num = int(input("정수 입력 > "))
    print("list의 요소 :", list_a[input_num])
except ValueError:
    # ValueError가 발생하는 경우
    print("정수를 입력해 주세요")
except IndexError:
    # IndexError가 발생하는 경우
    print("인덱스의 값을 벗어났습니다.")
    
# 정수가 아닌 값 입력 : ValueError 발생
정수 입력 > Hello
정수를 입력해 주세요

# 리스트의 인덱스를 넘는 값 입력 : IndexError 발생
정수 입력 > 10
인덱스의 값을 벗어났습니다.

 

✏️ 예외를 구분할 때 각각의 except 구문 뒤에 예외 객체를 붙여 활용할 수 있다. as 키워드를 사용한다.

list_a = [52, 273, 32, 72, 100]

# try except 구문으로 예외 처리
try:
    # 예외가 발생할 가능성이 있는 구문
    input_num = int(input("정수 입력 > "))
    print("list의 요소 :", list_a[input_num])
except ValueError as excption:
    # ValueError가 발생하는 경우
    print("정수를 입력해 주세요")
    # 예외 객체 출력
    print("exception: ", excption)
except IndexError as excption:
    # IndexError가 발생하는 경우
    print("인덱스의 값을 벗어났습니다.")
    # 예외 객체 출력
    print("exception: ", excption)

# IndexError 발생시킨 경우
정수 입력 > 100
인덱스의 값을 벗어났습니다.
exception:  list index out of range

 

★ except 구문으로 예외를 구분하는 경우, 예외 조건에 일치하는 것이 없다면 프로그램이 종료된다.

    → except 구문의 마지막에는 Exception 을 추가하여 프로그램의 종료를 막는 것이 좋다.

★ '이 코드에서 어떤 예외가 발생할 것인지' 잘 예측하는 것이 중요하다.

list_a = [52, 273, 32, 72, 100]

# try except 구문으로 예외 처리
try:
    # 예외가 발생할 가능성이 있는 구문
    input_num = int(input("정수 입력 > "))
    print("list의 요소 :", list_a[input_num])
    예외발생()
except ValueError as excption:
    # ValueError가 발생하는 경우
    print("정수를 입력해 주세요")
    # 예외 객체 출력
    print("exception: ", excption)
except IndexError as excption:
    # IndexError가 발생하는 경우
    print("인덱스의 값을 벗어났습니다.")
    # 예외 객체 출력
    print("exception: ", excption)
except Exception as exception:
    # ValueError 와 IndexError가 아닌 예외가 발생한 경우
    print("이외의 예외가 발생하였습니다.")
    print(type(exception), exception)

# IndexError / ValueError가 아닌 예외 발생
정수 입력 > 1
list의 요소 : 273
이외의 예외가 발생하였습니다.
<class 'NameError'> name '예외발생' is not defined

 

✏️ raise 구문 : 예외를 강제로 발생시키고 싶을 때 사용하는 구문이다.

raise 예외 객체

Chapter 07. 모듈

[표준 모듈]

 

✏️ 모듈(module) : 파이썬은 모듈 기능을 활용해 코드를 분리하고 공유한다. 모듈은 여러 변수와 함수를 가지고 있는 집합체 이다.

     1️⃣ 표준 모듈 : 파이썬에 기본적으로 내장되어 있는 모듈 

     2️⃣ 외부 모듈 : 다른 사람들이 만들어서 공개한 모듈

 

✅ 모듈을 가져올 때는 import 구문을 사용하며, 코드의 가장 위에 작성한다.

import 모듈 이름

# 예시 : 수학과 관련된 모듈인 math모듈 가져오기
import math

 

✅ 모듈을 가져온 후 모듈에서 제공하는 변수나 함수를 사용할 수 있다.

import math

# 사인값을 구하는 내장 함수
math.sin(1)

# 0.8414709848078965

 

✅ from 구문

  • 모듈을 읽어들일 때 from 구문을 사용해서, 모듈에서 가져오려는 변수나 함수 앞에 모듈 이름을 생략할 수 있다.
from 모듈 이름 import 가져오고 싶은 변수 또는 함수
from math import sin

# math 를 붙이지 않아도 사용이 가능해 졌다.
sin(1)

# 0.8414709848078965

 

✅ as 구문

  • 모듈을 가져올 때 이름을 변경해서 사용하고 싶은 경우 as 구문을 사용한다.
from 모듈 as 사용하고 싶은 식별자
import math as m

# math 모듈을 m 이라는 이름으로 치환해서 사용한다.
m.sin(1)

# 0.8414709848078965

[기본 미션 : 구문 오류와 예외의 차이 설명하기 (p.379 1번 문제) ]

 

✅ 구문 오류는 프로그램이 실행되기 전에 발생하는 문법적인 오류이며, 해결하지 않으면 프로그램 자체가 실행 되지 않는다. 예외는 프로그램이 실행 중에 발생하는 오류로, 예외 처리 (ex. try except 구문) 를 통해 해결할 수 있다.

 

[선택 미션 : p. 381 3번 문제 풀고 인증하기]

1️⃣ 정수형과 문자를 연산할 수 없어서 발생하는 예외

2️⃣ 문자열 "안녕하세요" 를 정수로 변환할 수 없어서 발생하는 예외

3️⃣ 괄호가 제대로 닫히지 않아서 발생하는 구문 오류

4️⃣ 리스트의 인덱스 범위를 벗어난 예외

+ Recent posts