예외 처리 (exception handling)

Bleu·2023년 8월 23일
0

python

목록 보기
5/22

오류

  • 함수나 메소드가 처리 도중 다음 명령문을 실행할 수 없는 상황
  • 오류 중 처리 가능한 것을 Exception(예외)이라 명 → 그 exception을 처리하는 것을 Exception Handling

오류 종류

→ 파이썬 문법 어김으로 발생하는 오류

  • 코드 상 100% 발생하는 오류
  • 코드를 수정해야함
  • 컴파일 방식 언어의 경우 컴파일 때 에러를 내서 수정

→ 실행 환경 문제로 발생하는 오류

  • 코드상에서는 Exception의 발생여부를 확신할 수 없음
  • 만약 발생할 경우 어떻게 처리할지를 구현해야 함

Exception handling

: Exception이 발생되어 프로그램이 더이상 실행될 수 없는 상황을 처리(handling)해서 정상화 시키는 작업

📍 try, except 구문
try:
    Exception 발생가능한 코드 블록
except [Exception클래스 이름 [as 변수]] :
    처리 코드

# [ ] 안에는 생략 가능
  • try block

    	⇒ exception 발생 가능성 있는 코드 + 그 코드와 연결된 코드( = exception 발생하지 않을 시 실행되는 코드)
  • except block

    	⇒ exception이 발생해야만 실행

except: : try block에서 발생한 모든 Exception을 처리하는 경우
except Exception클래스 이름 : try block에서 발생한 특정 Exception만 따로 처리할 경우
except Exception 클래스 이름 as 변수명 : try block에서 발생한 특정 Exception이 왜 발생했는지 등의 정보를 사용할 경우 변수명을 이용해 정보 조

Exception 들 별로 각각 처리할 수 있으면 이 경우 except 구문(처리 구문)을 연속해서 작성

ex) try - except 구문 사용 예시

print("start program")     #1

try:
    num = int(input("정수:"))  #2  exception 발생 가능성 있는 코드
    result = 10 // num         #3  #2가 실행이 안되면 차피 #3,#4 모두 실행 불가
    print("result:", result)   #4
except ValueError:  # ValueError를 처리하는 BLOCK
    print("정수로 변환 못함. - ValueError 발생")   # EH1
except ZeroDivisionError:
    print("0으로는 못나눔. - ZeroDivisionError 발생")   # EH2
except:   # 두 exception을 제외한 나머지 excepttion을 처리
    print("실행도중 문제 발생, 일단 처리 완료")   # EH3
     
    
print("end program ==> next 작업")    #5

# try에서 ValueError 발생 (2): 1, EH1, 5
# try에서 ZeroDivisionError 발생(3): 1, 2, EH2, 5
# try에서 ValueError, ZeroDivisionError를 제외한 exception 발생(NameError):
#       1, 2, 3, 4, EH3, 5

📍 finally 구문

: 예외 발생여부, 처리 여부와 관계없이 무조건 실행되는 코드블록
: try 구문에 반드시 실행되야 하는 코드블록을 작성할때 사용

구문순서

  1. try - except - finally
  2. try - except
  3. try - finally

⇒ finally 는 except 보다 먼저 올 수 없음
→ finally block은 입출력 관련해서 자주 쓰임

ex)

try:
    a = int(input())  
except:
    print("예외 발생")  #if-else 같이 except이 맞으면 실행, 아니면 아래 else 실행
else:
    print(a + 10)
finally:
    print("무조건 실행 할 코드")

Exception 발생

사용자 정의 Exception 클래스 구현

  • 파이썬은 Exception 상황을 클래스로 정의해 사용
  • 구현
    • Exception 클래스를 상속받는다.
    • 클래스 이름은 Exception 상황을 설명할 수 있는 이름을 준다.

→ 함수나 메소드가 더 이상 작업을 진행 할 수 없는 조건이 되면 Exception을 강제로 발생

Call Stack Mechanism

  • 발생한 Exception은 처리를 하지 않으면 caller에게 전달된다.
    • 발생한 Exception에 대한 처리가 모든 caller에서 안되면 결국 파이썬 실행환경까지 전달되어 프로그램은 비정상적으로 종료 되게 된다.

raise 구문

: Exception을 강제로 발생

(업무 규칙을 어겼거나 다음 명령문을 실행할 수 없는 조건이 되었을 때)

  • 구문 raise Exception객체

raise와 return

  • 함수나 메소드에서 return과 raise 구문이 실행되면 모두 caller로 돌아감
  • return은 정상적으로 끝나서 돌아가는 의미이므로 처리 결과가 있으면 그 값을 가지고 돌아감
    ⇒ caller는 그 다음 작업을 이어서 하면 됨
  • raise는 실행 도중 문제(Exception)가 생겨 비정상적으로 끝나서 돌아가는 의미 의므로 비정상적인 상황 정보를 가지는 Exception객체를 반환 값으로 가지고 돌아감
    ⇒ caller는 try - except구문으로 발생한 exception을 처리하여 프로그램을 정상화 하거나 자신도 caller에게 exception을 발생 시키는 처리를 함

0개의 댓글