행복한 연어의 이야기

(윈도우 시스템) 17. 구조적 예외처리(SEH) 기법 본문

IT/윈도우 시스템 프로그래밍

(윈도우 시스템) 17. 구조적 예외처리(SEH) 기법

해피살몬 2021. 8. 23. 19:23

1. SEH (Structured Exception Handling)

"프로그램 실행시 발생하는 문제점 대부분을 예외라고 인식하자."

SEH 는 성능을 약간 저하시킨다.

성능을 중요시하는 서버 프로그래밍에서 문제가 될수 있지만

서버 프로그래밍에서는 시스템 호환성을 위해 SEH 를 사용하지 않는다.

하드웨어적 예외와 소프트웨어적 예외

하드웨어 예외란 하드웨어에서 인식하고 알려주는 예외소프트웨어 예외는 소프트웨어에서 감지하는 예외이다.

 

2. 종료 핸들러(Termination Handler)

종료 핸들러의 구성과 동작 원리

	__try
	{
		//코드 블록
	}
	__finally
	{
		//종료 처리 블록
	}

__try __finally 은 __try 문을 한줄이라도 실행하게 되면 __finally 문을 실행한다.

__try 문을 빠져나오는 대표적인 상황은 break, continue, return, goto, 예외 가 있다.

프로세스 강제 종료나 쓰레드 강제 종료는 __finally 문으로 들어오지 않는다.

보통 파일개방시, 커널 오브젝트 핸들 반환시 등에 사용된다.

 

3. 예외 핸들러(Exception Handler)

예외 핸들러의 구성과 동작 원리

	__try
	{
		//코드 블록(예외 발생 경계 지역)
	}
	__exception (예외처리 방식)
	{
		//예외 처리 블록
	}

__try __exception 은 __try 문에서 예외처리가 발생하게 되면 __exception 문을 실행한다.

__exception(예외처리 방식)에서 예외처리 메커니즘을 어떤방식으로 할지 정할 수 있다. (기본적으로 3가지가 있다.) 

예외상황에 따라 예외처리를 하고 싶다면__exception 내에서 GetExceptionCode 함수를 호출하면 알수 있다.

예외처리가 발생했을때 A 함수내 예외처리문이 없으면 A 함수는 종료되고 (스택 프레임 반환)

A함수를 호출한 B 함수로가서 예외처리문이 있는지 검사한다.

이렇게 계속 진행이 되며 예외처리문이 없으면 main 함수까지, main에도 없으면 main 함수도 반환하며

프로그램이 종료하게 된다.

 

*__try __exception 은 Windows 에서 제공하는 예외처리 문,

try catch 문은 C++ 에서 제공하는 예외처리 문이다. 

try catch 문은 내부적으로 __try __exception 로 구성되어 있다.

 

4. 소프트웨어 기반의 개발자 정의 예외

소프트웨어 예외의 발생

하드웨어 예외는 하드웨어가 디자인 될 당시에 결정되고 예외의 종류 추가는 불가능하다.

소프트웨어는 소프트웨어가 디자인될 당시 결정되기에 예외의 종류 추가가 가능하다.

 

소프트웨어 예외를 발생시키는 다음 함수를 통해 예외의 종류를 늘릴 수 있다.

void RaiseException(
	DWORD dwExceptionCode,			//발생시킬 예외의 형태
	DWORD dwExceptionFlage,			//예외발생 이후 실행방식에 제한을 둘때 사용
	DWORD nNumberOfArgument,		//추가 정보의 개수
	const ULONG_PTR* lpArguments		//추가 정보
)

 

첫번째 인자 dwExceptionCode 는 GetExceptionCode  함수를 호출할 때 얻게 되는 값을 지정한다고 생각하면 된다.

 

알고 넘어가야할 것

1. SEH가 가져다 주는 이점

2. 종료 핸들러의 동작 원리와 적용 범위에 대한 이해

3. 대표적인 예외처리 방식

4. 처리되지 않는 예외의 이동

5. 과도한 SEH 는 좋지 않다.

 

'윤성우 저자'님의 '뇌를 자극하는 윈도우즈 시스템 프로그래밍' 책을 보고 정리한 내용입니다.

Comments