[파이썬] try except 구문을 이용한 예외 처리와 raise 키워드

2025. 2. 10. 14:36·[파이썬]
728x90

구문 오류와 예외

오류의 종류

  • 프로그램 실행 전에 발생하는 오류
    • 구문 오류 - Syntax Error
  • 프로그램 실행 중에 발생하는 오류
    • Runtime Error & Exception

구문 오류

괄호의 개수, 들여쓰기 문제 등으로 프로그램이 실행되기 전에 발생하는 오류

print("따옴표 하나 안닫기)

#result
SyntaxError: EOL while scanning string literal

예외 & 런타임 오류

프로그램이 실행 중 발생하는 오류

print("Hello")
list[1] #리스트 선언 안하고 그냥 접근하기

#result
NameError: name 'list' is not defined

기본 예외 처리

예외를 해결하는 모든 것을 예외 처리(exception handling)라고 부름

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

예외 상황 확인하기

number_input_a = int(input("정수: ")

print("반지름: ",number_input_a)
print("원의 둘레: ", 2*3.14*number_input_a)
print("원의 넓이: ", 3.14*number_input_a**2)

만약 여기서 정수를 넣지 않는다면? → 예외 발생

ValueError: invalid literal for int() with base 10: '정수가 아닌 자료'
#int()가 정수로 바꿀 수 없는 자료형을 받았을 때 나오는 예외코드

조건문으로 예외 처리하기

위 코드는 ‘isdigit()’, 즉 숫자로만 이루어졌는지 확인하여 값이 참일때만 계산을 실시하고 그렇지 않을 땐 정수를 입력하지 않았다고 출력하면 처리가 가능함

number_input_a = int(input("정수: ")

if number_input_a.isdigit():
    print("반지름: ",number_input_a)
    print("원의 둘레: ", 2*3.14*number_input_a)
    print("원의 넓이: ", 3.14*number_input_a**2)
else:
    print("정수를 입력하지 않았어요")

try except 구문

기본구조

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**2)
except:
    print("정수를 입력하지 않았어요")

try except 구문과 pass 키워드

예외가 발생했을 때 프로그램이 강제 종료되는 것을 막는 목적으로 pass 키워드를 자주 사용한다

try:
    danger code...
except:
    pass

try except else 구문

try except 구문 뒤에 else 구문을 붙여서 사용하면 ‘예외가 발생하지 않았을 때 실행할 코드’를 지정할 수 있다

try:
    dangerous code...
except:
    code start when error occur
else:
    code start when error not occur

finally 구문

try except 구문 가장 마지막에 사용되는 구문으로 예외가 나오든 안나오든 반드시 실행해야되는 코드를 작성할 수 있다

try:
    dangerous code
except:
    handling exception
else:
    codecode...
finally:
    run unconditionally

try, except,else,finally 종합 예제

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**2)
finally:
    print("어떻게든 프로그램은 끝남")

try, except, finally 구문 조합 규칙

  1. try 구문은 단독으로 사용이 불가능하며 반드시 except 혹은 finally 구문이 와야한다
  2. else 구문은 반드시 except 구문 뒤에 사용한다
  • try + except
  • try + finally
  • try + except + else
  • try + except + finally
  • try + except + else + finally

이 외 조합은 SyntaxError: invalid syntax 가 발생함

finally 구문의 쓰임새

반드시 finally를 사용할 필요는 없다

단순히 생각해봐도 굳이 finally를 사용하지 않아도 맨 마지막에 한 줄의 코드로 finally 키워드 사용을 쓸모없게 만들 수 있는 경우가 있다

try 구문 내부에서 return 키워드를 사용하는 경우

그러나 finally 키워드는 함수 & 반복문 안에 있을 때 사용하면 코드가 깔끔해진다

def test():
   print("~~~")
   try:
       print("~~~~~")
       return
       print("after return")
   except:
       print("except")
   else:
       print("else")
   finally:
       print("finally")
   print("end")
   
   
test()

#result
~~~
~~~~~
finally

try 구문 내부에 return 키워드가 있어도 함수를 종료하기 전에 반드시 finally 구문을 실행한다. 이는 파일 처리에서 마지막에 파일을 닫는 용도로 많이 사용된다

def write_txt_file(filename, text):
    try:
        file = open(filename,"w")
        return
        file.write(text")
    except:
        print("Error")
    finally:
        file.close()
        
write_txt_file("test.txt","Hello")

try 구문 내 return을 만나도 finally 안에 있는 file.close()가 실행되어 파일이 문제없이 닫힌다

반복문과 함께 사용하는 경우

finally 구문은 break로 반복문을 빠져나갈 때에도 반드시 실행된다

while True:
    try:
        print("try")
        break
        print("try break")
    except:
        print("Error")
    finally:
        print("finally")
    print("end")
print("program end")

#result
try
finally
program end

예외 고급

프로그래밍에서 예외가 발생 시 ‘예외 객체’라는 곳에 예외의 정보가 저장됨

예외 객체 사용법

try:
    예외 발생 가능성 있는 구문
except 예외 종류 as 예외 객체를 활용할 변수:
    예외 발생 시 실행할 구문

예외 객체

  • Exception - 모든 예외의 상위 클래스

우리가 자주 보던 invalid literal for int() with base 10: ~~~이나 다른 에러 메세지는 예외 객체에 저장된 것을 터미널에 표시한 것임

try:
    number_input_a=int(input("정수: "))
    print("반지름: ",number_input_a)
    print("원의 둘레: ", 2*3.14*number_input_a)
    print("원의 넓이: ", 3.14*number_input_a**2)
except Exception as exception:
    print(type(exception))
    print(exception)
    
#result - 만약 정수가 아닌 것을 넣었을 때
<class 'ValueError'> - #type(exception)
invalid literal for int() with base 10: 'f' - #print(exception)

예외 구분하기

파이썬은 except 뒤에 예외의 종류를 붙임으로써 예외를 구분할 수 있음

try:
    code
except 예외 종류:
    code
except 예외 종류:
    code
exc...

예외 구분 구문과 예외 객체

예외를 구분할 때 각각의 except 구문 뒤에 예외 객체를 붙여 활용할 수도 있다

as 키워드를 사용해 객체를 사용할 변수를 입력하고 사용할 수 있다

list=[12,34,45,56]

try:
    number_input = int(input("digit: "))
    print("{}번째 요소: {}".format(number_input,list[number_input-1]))
except ValueError as exception:
    print("정수 입력하라 했자나")
    print(exception)
except IndexError as exception:
    print("그만큼 데이터 없어")
    print(exception)

입력한 값이 정수가 아니라면 첫번째 except 구문 실행

입력한 값이 인덱스를 뛰어 넘는 위치라면 두번째 except 구문 실행

모든 예외 잡기

모든 예외를 모두 예상하고 except 구문으로 처리하는 건 굉장히 어렵다

따라서 Exception 이라는 모든 예외의 상위 클래스를 사용하여 모든 예외가 except 구문에 걸리게 만들 수 있다

list=[12,34,45,56]

try:
    number_input = int(input("digit: "))
    print("{}번째 요소: {}".format(number_input,list[number_input-1]))
except ValueError as exception:
    print("정수 입력하라 했자나")
    print(exception)
except IndexError as exception:
    print("그만큼 데이터 없어")
    print(exception)
except Exception as exception:
    print("미리 파악하지 못한 예외")
    print(exception)

위에 있는 ValueError & IndexError 외의 다른 예외가 발생했을 때 마지막에 있는 Exception에서 변수를 잡아 프로그램이 죽지 않게 하는 것이 좋다

raise 구문

프로그램 개발 중 강제로 예외를 발생시키거나 일부로 예외를 발생시키는 경우가 있다

이때 raise 키워드를 사용하여 예외를 강제로 발생시킬 수 있다

raise 예외 객체

사용 방법은 raise 뒤에 예외 객체를 입력하면 된다

728x90

'[파이썬]' 카테고리의 다른 글

[파이썬] 외장 모듈 소개와 설치 및 사용법 (Beautifulsoap, Flask)  (0) 2025.02.12
[파이썬] 모듈의 기초 사용법과 내장 모듈들(sys, math, datetime, time, urllib) 살펴보기  (0) 2025.02.12
[파이썬] 제너레이터와 yield 키워드  (0) 2025.02.08
[파이썬] 파이썬에서 파일 작업하기 (기초)  (0) 2025.02.08
[파이썬] 튜플과 람다  (0) 2025.02.08
'[파이썬]' 카테고리의 다른 글
  • [파이썬] 외장 모듈 소개와 설치 및 사용법 (Beautifulsoap, Flask)
  • [파이썬] 모듈의 기초 사용법과 내장 모듈들(sys, math, datetime, time, urllib) 살펴보기
  • [파이썬] 제너레이터와 yield 키워드
  • [파이썬] 파이썬에서 파일 작업하기 (기초)
뽕규의 스케치북
뽕규의 스케치북
공부 열심히 해볼게요
  • 뽕규의 스케치북
    뽕규의 스케치북
    뽕규의 스케치북
  • 전체
    오늘
    어제
  • 링크

    • 파이썬 공식 문서
    • GitHub
    • 분류 전체보기 (37)
      • [파이썬] (17)
      • [데이터 분석] (3)
      • [Git&GitHub] (5)
      • [자료구조 & 알고리즘] (3)
      • [안드로이드 앱] (0)
      • [네트워크] (0)
      • [머신러닝 & 딥러닝] (0)
      • [SQL] (1)
      • [컴퓨터 구조 & 운영체제] (0)
      • [개발자 수학] (0)
      • [노션] (6)
      • [기타] (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 공지사항

  • 인기 글

  • 태그

    개념
    깃허브
    공부
    깃
    소스트리
    기초
    TODO
    python
    노션
    GIT
    수식
    DB
    github
    push
    파이썬
    sourcetree
    함수
    pull
    *
    발전
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
뽕규의 스케치북
[파이썬] try except 구문을 이용한 예외 처리와 raise 키워드
상단으로

티스토리툴바