15-1. 들어가며


  • 학습 목표
    • 구문 오류와 예외의 구분
    • 예외 처리 방법 배우기
    • 예외 강제 발생 방법 및 이유 설명

클로저

클로저 만족 조건

  1. 어떤 함수의 내부 함수일 것
  2. 내부 함수가 외부 함수의 변수를 참조할 것
  3. 외부 함수가 내부 함수를 반환할 것


15-2. 오류 종류


오류의 종류

  • 구문 오류(Syntax error)
  • 예외(Exception) 또는 런타임 오류(Runtime error)

구문 오류(Syntax Error)

  • 코드 실행 오류가 나는 것
  • 구문 오류를 해결하지 않으면 코드가 실행되지 않음. 반드시 수정 후 재실행!

예외(Exception) 또는 런타임 오류(Runtime Error)

  • 코드 실행 발생
  • 실행은 되지만, 어떤 에러가 발생했는지 나옴.
  • 예외 처리(Exceptional Handling)로 해결 가능
    • 조건문 사용
    • try 구문 사용

      구문 오류는 맞는 코드로 수정하는 것 외에는 방법이 ❌



15-3. 예외 처리(Exception Handling)

예외 처리를 하는 이유

  • 문법 오류가 아니더라도, 런타임 프로세스에서 발생할 수 있는 예외들이 있기 때문!

예외 처리 방법

  • 조건문
  • try - except 구문

조건문

  • 문자열이 숫자인지 판별하는 함수 isdigit()로 정수만 입력받기

  • ++ 음수도 판별하려면 lstrip 사용!

조건문의 단점 : 예외 발생 상황을 모두 예측해 처리해야한다는 것..!


try - except 구문

  • 어떤 상황에서 예외 발생이 되는지 완전히 알지 못하더라도 프로그램이 크래시되는 현상을 막을 수 있음.
try:
    예외가 발생할 수 있는 코드
except (발생 오류 (as 발생 오류 변수)):
    예외가 발생했을 때 실행할 코드


try - except - pass 구문

  • 중요성이 떨어지는 코드가 프로그램을 강제 종료하지 않도록 하는 목적으로 사용
  • except 구문에 아무것도 넣지 않고 try 구문만 사용
    • 단, except 구문에는 pass 키워드를 함께 사용해야 함!


try - except - else 구문

  • else : 예외 발생이 되지 않을 때 실행할 코드 지정 가능!
    • 예외 발생 가능성이 있는 코드 -> try 구문
    • 그 외 -> else 구문으로 빼기!
try:
    예외가 발생할 수 있는 코드
except:
    에외가 발생했을 때 실행할 코드
else:
    예외가 발생하지 않았을 때 실행할 코드

else 구문은 기존의 try - except 구문과 큰 차이가 없어 개인의 선택으로 사용(단, 알아두는 것이 좋다!)


try - except - else - finally 구문

  • finally : 예외의 발생 여부와 관계없이 무조건 실행하고자 하는 코드를 작성
try:
    예외가 발생할 수 있는 코드
except:
    예외가 발생했을 때 실행할 코드
else:
    예외가 발생하지 않았을 때 실행할 코드
finally:
    예외와 관계없이 무조건 실행되는 코드


예외 처리 구문 규칙 2가지

  • try 구문은 단독으로 쓰일 수 없음(except, finally 구문과 같이 써야함)
  • else 구문은 except 구문 뒤에 사용하며 반드시 함께 사용해야 함.

  • 위의 규칙에 따른 구문 조합
    • try + except
    • try + except + else
    • try + except + finally
    • try + except + else + finally
    • try + finally

에러

  • raise 키워드 : 에러를 지정하고 에러 메세지를 넣음.
    raise 에러('에러 메시지')

에러의 종류

SyntaxError

  • 잘못된 문법(구문 오류)

NameError

  • 참조변수 없음
    ex) NameError: name 'a' is not defined -> 코드 상에서 a 자체를 선언한 적이 없는 것!

ZeroDivisionError

  • 0으로 나눌 수 없음
    ex) ZeroDivisionError: division by zero

IndexError

  • 인덱스 범위 벗어남(리스트에 없는 원소 호출 시 발생)
    ex) IndexError: list index out of range

ValueError

  • 참조 값이 없음(애초에 없던 요소임)
    ex) ValueError: list.remove(x): x not in list

KeyError

  • 주로 딕셔너리 사용 시 키 없음 에러가 발생함
    • get 메서드 활용해 해결 : print(mydict.get('Park'))

AttributeError

  • 모듈, 클래스의 잘못된 속성 사용
    ex) AttributeError: module 'time' has no attribute 'month'

FileNotFoundError

  • 파일 못 찾음(그 경로에 파일 없음)
    ex) FileNotFoundError: [Errno 2] No such file or directory: 'ex.txt'

TypeError

  • 타입 불일치
    ex) TypeError: can only concatenate list (not "str") to list

예외 처리 전략 (EAFP vs LBYL)

  • EAFP
    • “It’s Easier to Ask Forgiveness than Permission”
    • 일단 수행(try)
    • 에러 발생 시 그때 처리(except)
  • LBYL
  • “Look Before You Leap”
    • 코드 실행 전 에러 발생 조건을 미리 따져서 조건문(if문)으로 코딩
profile
언젠가 내 코드로 세상에 기여할 수 있도록, Data Science&BE 개발 기록 노트☘️

2개의 댓글

comment-user-thumbnail
2024년 10월 16일

안녕하세요, 하얀님. 데싸 3기 그루입니다. 노션에서 발견하고 들어왔는데, 정말 정리를 잘해놓으셨네요👍👍 글을 잘 정리해놓으셔서 종종 들어오게 될 것 같습니다. 많이 배워갑니다🙂

1개의 답글

관련 채용 정보