시작은 미미하나 끝은 쥬쥬하리라.

Study/Windows System Programming

[Window System Programming] Chapter 17. 예외 처리 / SEH & 종료 핸들러 / 예외 핸들러

코딩뚜벅이 2024. 1. 20. 23:14

4-17 예외 처리 / SEH & 종료 핸들러 / 예외 핸들러

  • 예외 처리
  • SEH & 종료 핸들러
  • 예외 핸들러

예외 처리

CPU의 예외 처리 정책

CPU는 미리 정의된 예외 상황에서 소프트웨어, OS 등이 동작하는 중간에 예외가 발생하면 정책에 따라 처리

-> CPU는 에외 상황이 발생하면 발생 여부만 알려주고 처리의 구체적인 방안은 소프트웨어가 결정

-> 소프트웨어는 예외 처리 핸들러를 마련 해놓고, 예외 발생시 예외 핸들러 동작

-> OS를 하드웨어에 넣는 시점에서 이미 예외 핸들러는 설정

 

 

하드웨어 예외 

이미 결정되어 있는 CPU의 예외

-> 하드웨어 예외의 처리 결정권은 소프트웨어에게 있음

 

 

 


 

SEH & 종료 핸들러

SEH

Windows OS는 SEH(구조적 예외 기법) 매커니즘을 가지고 있음

-> 1. CPU에서 예외 발생

-> 2. CPU에서 OS로 예외 전달

-> 3. OS에서 애플리케이션으로 예외 전달, 동시에 예외 처리 방법도 같이 전달

-> OS가 애플리케이션에게 알려주는 예외 처리 방법 = SEH 매커니즘

 

SEH 매커니즘은 CPU 예외 + OS 예외 모두 처리

-> 예외의 시작점이 CPU : 하드웨어 예외

-> 예외의 시작점이 OS : 소프트웨어 예외

-> SEH는 애플리케이션단에서의 예외도 어느정도 처리 가능

 

 

 

예외 처리에 예시

ex) 예외 처리 잘못된 예시

 

 

 

 

ex) 예외 처리 개선된 예시

 

 

 

-> 프로그램의 실제 흐름과 흐름에 따른 예외 처리 영역을 분리하여 가독성 확보

 

 

예외 vs 에러

에러 : 컴파일 타임 오류(문법적), 치명적이며 반드시 수정 필요

예외 : 소프트웨어가 정한 상황을 벗어난 경우, 좋은 소프트웨어는 예외 발생 시 종료되지 않게 처리

 

 

종료 핸들러

__try, __finally로 구성

-> __try 구문이 하나라도 실행되었다면 __finally 블록 실행

 

 

 


 

예외 핸들러

예외 핸들러

try 블록과 except 블록으로 구성

-> 두 블록은 하나의 구문으로 이해 필요

-> try 블록에서 발생한 예외는 execpt 블록에서 처리

-> try 블록에서 예외 발생 시, execpt 블록으로 이동하여 예외 처리

 

 

except 블록에서 예외 처리 방식

1. EXCEPTION_EXECUTE_HANDLER

-> 예외 처리 후 execpt 블록을 실행하고, try에서 예외 발생 이후의 코드는 실행하지 않을 것

 

2. EXCEPTION_CONTINUE_EXECUTION

-> except 블록을 실행하지 않고 예외가 발생한 지점의 코드를 다시 실행

 

3. EXCEPTION_CONINUE_SEARCH

-> 예외가 발생하면 해당 함수를 리턴하고 상위 함수의 except에서 예외를 처리

 

 

예외 구분