例外情報の取得(C言語)

説明:

メモリ割り当て関数TMallocは負のサイズを指定されると例外を発生する。例外発生時には、例外情報として指定されたサイズが渡される。例外発生時に、フィルタ関数にGetExceptionInformationの戻り値を渡すことにより、どのようなサイズが与えられたかを表示する。

サンプルコード:

#define TEXCEPTION_MEMORY_ERROR 0x1001

/* フィルタ関数 */
DWORD TExceptionFilter(DWORD code, LPEXCEPTION_POINTERS pInfo)
{
	if(0x1000 <= code && code <= 0x1fff) {
		printf("例外発生: 負の値(%d)のサイズのメモリを割り当てようとした.\n", 
			pInfo->ExceptionRecord->ExceptionInformation[0]);
		return(EXCEPTION_EXECUTE_HANDLER);	  
	}
	else return(EXCEPTION_CONTINUE_SEARCH);
}

/* メモリ割り当て関数 */
void *TMalloc(int size)
{
	if(size <= 0) {
		RaiseException(
			TEXCEPTION_MEMORY_ERROR,
			EXCEPTION_NONCONTINUABLE,
			1,
			&size);
	}

	return(GlobalAlloc(GMEM_FIXED, size));
}

/* メインの処理 */
void DoException()
{
	void *p1 = NULL;
	void *p2 = NULL;

	try {
		try {
			printf("メモリ割り当て1\n");
			p1 = TMalloc(100);

			printf("メモリ割り当て2\n");
			p2 = TMalloc(-30);

		} except(TExceptionFilter(GetExceptionCode(), GetExceptionInformation())) {
			/* 例外発生 */
		}
	} finally {
		if(p1 != NULL) {
			printf("メモリ解放1\n");
			GlobalFree(p1);
		}

		if(p2 != NULL) {
			printf("メモリ解放2\n");
			GlobalFree(p2);
		}
	}
}
(original text:1998/12/25 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。