[Basic] 예외 처리(Try, exception)

고보·2024년 1월 29일

Python 기초 강의 정리

목록 보기
12/15

1 예외

  • 소프트웨어적으로 문법적인 문제는 없으나 실행 중에 발생하는 예상하지 못한 문제. (vs 에러: 소프트웨어적으로 처리할 수 없는 문제. 즉, 실행이 불가능하고 컴파일 중에 주로 발생.)
    ex) a/b에서 b=0이면 예외
    a가 define되지 않았는데 a/b는 에러
  • 예외 관련 클래스는 Exception 클래스를 상속한다.
    • BaseException: 모든 예외의 최상위 부모 클래스
      • Exception: 모든 일반적인 예외의 부모 클래스
    • ArithmetricError: 산술 연산 관련 에러
      • ZeroDivisionError: 0으로 나눴을 때
    • OSError: 시스템 관련 에러(파일 시스템, 네트워크 연결, 운영 체제 등)
      • FileNotFoundError: open을 하는 파일이 없을
    • LookupError: 인덱싱 또는 키 검색 관련 에러
      • IndexError: 없는 인덱스를 찾을 때
    • SyntaxError: 구문 에러
      • IndentationError: 코드 들여쓰기가 올바르지 않을 때
    • ValueError: int('str')처럼 올바르지 않은 값이 들어갈 때

2 예외 처리

  • 예외가 전체 프로그램 실행에 영향이 없도록 처리.
    ex) 프로그램1 - 프로그램2 - 프로그램3 이 있을 때, 1에서 예외 발생시 나머지가 다 실행 안되는데, 별도 처리하고 2, 3은 실행되도록
  • try: 이 블록을 먼저 수행
  • except: 에러가 발생하면, try문 중단하고 except문 실행. 무슨 에러든 실행. 만약 에러 발생 안하면 실행 안됨.
    • except ZeroDivisionError: 이렇게 오류 이름 명시할 경우, 지정한 오류가 발생했을 때만 여기로.
    • except ZeroDivisionError as e: 이렇게 해서 e를 아래 구문에 이용 가능
    #1 2가지 경우의 오류 지정
    except ZeroDivisionError:
    	pass
    except ValueError:
    	pass
       
    #2 2가지 경우 오류 묶어서 지정
    except (ZeroDivisionError, ValueError):
  • else: try에서 에러가 없는 경우(except문이 시행되지 않았을 때) 시행
  • finally: try에서 에러가 있든 없든(except문이 시행되든 아니든) 항상 실행

2-1 pass, raise

  • pass: 오류 발생시 그냥 통과할 때 씀
  • raise: 예외 강제로 발생.
class Bird:
	def fly(self):
    	raise NotImplementedError

class Eagle(Bird):
	pass

eagle = Eagle()
eagle.fly()

이렇게 NotImplementedError로 작성 부분이 구현되지 않으면 
일부러 오류 발생시키는 것. 
Eagle 클래스에서 fly 기능을 오버라이딩하지 않고서, 
agle.fly()를 하면 NotImplementedError 발생. 
def calculate(n1, n2):
	if n2! = 0:
    	print(n1/n2)
    else:
    	raise Exception('0으로 나눌 수 없습니다.')

try:
	calculate(10, 0)
except Exception as e:
	print(f'Exception: {e}) => 0으로 나눌 수 없습니다 출력 
def sendSMS(msg):
	if len(msg) > 10:
    	raise Exception('MMS 전환 후 발송', 1) => 배열로 온다. 각각 Exception.args[0], [1] 
    else:
    	print('SMS')
def sendMMS(msg):
	if len(msg) <= 10:
    	raise Exception('SMS 전환 후 발송', 2)
    else:
    	print('MMS')

try:
	sendSMS(msg) => sms로 먼저 실행. 10보다 길면 위의 에러 발생. 
except Exception as e:
	print(f'e: {e.args[0]}') => 'MMS 전환 후 발송' 출럭
    print(f'e: {e.args[1]}') => '1' 출력
    if e.args[1] == 1: => 10보다 길어서 에러.args[1]1이면 MMS로 넘어감
    	sendMMS(msg)
    if e.args[1] == 2: => 10보다 짧아서 에러.args[1]2이면 SMS로 넘어감
    	sendSMS(msg)

3 Exception 클래스 만들기

  • Exception 클래스를 상속해서 사용자 예외 클래스 만들기
class UserException(Exception)
	def __init__(self, n):
    	super.__init__(f'{n}은 사용할 수 없습니다.')
class MyError(Exception):
	def __str__(self): => 객체를 호출하면 문자열을 반환하는 메서드. 일반적으로 그냥 객체를 호출하면 주소를 반환하는데, 아래 문자열을 반환. 
    	return '허용되지 않는 별명입니다.' 
profile
일본에서 일하는 게임 기획자. 시시해서 죽어버리지 않게, 재밌고 의미 있는 컨텐츠에 관심 있습니다. 그 도구로 데이터, AI도 찝적댑니다.

0개의 댓글