Python/기초

파이썬 기초③

망고고래 2024. 6. 13. 21:36

8. 예외

1)try

try: 예외가 발생할 수 있는 코드
except: 처리할 예외
else: 예외가 발생하지 않았을 경우

 

except에서 자주 쓰이는 예외

  • Exception: 모든 예외
  • ValueError: 적절하지 않은 값
  • TypeError: 잘못된 데이터 타입
  • KeyError: 딕셔너리에서 존재하지 않는 키 참조
  • FileNotFoundError: 파일이나 디렉토리를 찾을 수 없음
  • ZeroDivisionError: 숫자를 0으로 나누려고 함
  • AttributeError: 존재하지 않는 속성에 접근하려고 함
  • ImportError: 모듈을 찾을 수 없거나 가져올 수 없음
  • IOError(Python2)/OSError(Python3): 입출력 작업 중 에러 발생

*ValueError/TypeError

1)ValueError: 함수나 연산이 올바른 데이터 타입을 받았지만 값이 적절하지 않을 경우

int(): 문자열을 정수로 변환하는 함수

try:
	int("not a number")
except ValueError as e:
	print(f"ValueError 발생: {e}")
#int 함수는 문자열을 정수로 변환할 수 있지만,
#그 문자열이 숫자를 나타내지 않을 경우 ValueError 발생

2)TypeError: 올바르지 않은 데이터 타입을 받았을 경우

 

excep:

교재대로라면 Error가 지정되지 않은 except의 코드가 실행되어야 하는데  ValueError의 코드가 실행됐다...

5.5는 정수가 아니기 때문에 int로 변환하지 못해 ValueError가 발생한다.

 

2)예제

(1)sys 모듈

파이썬 표준 라이브러리의 일부. 파이썬 인터프리터와 관련된 여러 기능과 변수 제공

인터프리터 동작 제어, 현재 상태에에 대한 정보 획득 가능

(2)File = open('myfile.txt')

myfile.txt 파일을 읽기 모드로 엶

파일이 열리면 File 객체에 파일 핸들 저장

(3)\r\n: 줄바꿈

(4){0}: format 메서드로 전달되는 값으로 대체됨

 

 

 

args: 예외 객체의 속성, 예외와 관련된 추가 정보(오류 번호와 오류 메시지)를 튜플 형태로 저장

print(e.args[0])  # 예: 2
print(e.args[1])  # 예: 'No such file or directory'

 

 

여러 개의 예외 동시에 처리하기

try:
    Value = int(input("Type a number between 1 and 10: "))
except(ValueError, KeyboardInterrupt):
    print("You must type a number between 1 and 10!")
else:
    if(Value > 0) and (Value <= 10):
        print("You typed: ", Value)
    else:
        print("The Value you typed is incorrect!")

 

 

예제

TryAgain = True
while TryAgain:
    try:
        Value = int(input("Type a whole number: "))
    except ValueError:
        print("You must type a whole number!")
        continue
    except KeyboardInterrupt:
        print("\nYou pressed Ctrl+C!")
        print("See you next time!")
        break
    else:
        print(Value)
        
    try:
        DoOver = input("Try again (y/n)? ")
    except KeyboardInterrupt:
        print("\nYou pressed Ctrl+C!")
        print("See you next time!")
        break
    else:
        if DoOver.lower() == 'n':
            TryAgain = False

 

 

3)오류 일으키기: raise

try:
    raise ValueError
except ValueError:
    print("ValueError Exception!")

 

4)사용자 정의 에러 메시지

try:
    Ex = ValueError()
    Ex.strerror = "Value must be within 1 and 10."
    raise Ex
except ValueError as e:
    print("ValueError Exception!", e.strerror)

예외 객체 생성 후 에러 메시지 변수에 값 대입

 

5)사용자 정의 에러

class CustomValueError(ValueError):
    def __init__(self, arg):
        self.strerror = arg
        self.args = (arg)
try:
    raise CustomValueError("Value must be within 1 and 10.")
except CustomValueError as e:
    print("CustomValueError Exception!", e.strerror)

__init__(): 클래스의 생성자 역할

 

 

6)finally

import sys

try:
    raise ValueError("This is a ValueError")
except ValueError as e:
    print(f"Caught an exception: {e}")
    try:
        # sys.exit() 대신 예외를 다시 발생시킴
        sys.exit()
    except SystemExit:
        print("Caught SystemExit exception")
finally:
    print("This will always be executed.")