_set_invalid_parameter_handler
, _set_thread_local_invalid_parameter_handler
設定要在 CRT 偵測到無效引數時呼叫的函式。
語法
_invalid_parameter_handler _set_invalid_parameter_handler(
_invalid_parameter_handler pNew
);
_invalid_parameter_handler _set_thread_local_invalid_parameter_handler(
_invalid_parameter_handler pNew
);
參數
pNew
新無效的參數處理常式的函式指標。
傳回值
呼叫前的無效的參數處理常式的指標。
備註
許多 C 執行階段函式都會檢查傳遞給它們之引數的有效性。 如果傳遞無效引數,則此函式可以設定 errno
錯誤號碼,或傳回錯誤碼。 在這種情況下,也會呼叫無效的參數處理常式。 C 執行階段會提供預設全域無效的參數處理常式,以終止程式,並顯示執行階段錯誤訊息。 您可以使用 _set_invalid_parameter_handler
,將您自己的函式設定為全域無效的參數處理常式。 C 執行階段也支援執行緒區域無效的參數處理常式。 如果使用 _set_thread_local_invalid_parameter_handler
在執行緒中設定執行緒區域參數處理常式,則從執行緒呼叫的 C 執行階段函式會使用該處理常式,而不是全域處理常式。 一次只有一個函式可以指定為全域無效引數處理常式。 只有一個函式可以指定為一個執行緒的執行緒區域無效引數處理常式,但不同的執行緒可以有不同的執行緒區域處理常式。 線程本機處理程式可讓您變更程式碼中某個部分所使用的處理程式,而不會影響其他線程的行為。
執行階段呼叫無效參數函式時,通常表示發生無法復原的錯誤。 您提供的無效的參數處理常式函式應該會在儲存後中止任何資料。 除非您確信錯誤可復原,否則它不應該將控制權傳回至main函式。
無效的參數處理常式函式必須具有下列原型︰
void _invalid_parameter(
const wchar_t * expression,
const wchar_t * function,
const wchar_t * file,
unsigned int line,
uintptr_t pReserved
);
expression
引數是以寬字串表示引發錯誤的引數運算式。 function
引數是收到無效引數的 CRT 函式名稱。 file
引數是包含函式的 CRT 原始程式檔名稱。 line
引數是該檔案中的行號。 最後一個引數會予以保留。 除非使用偵錯版本的 CRT 程式庫,否則參數都會有值 NULL
。
根據預設,此函式的全域狀態會限定於應用程式。 若要變更此行為,請參閱 CRT 中的全域狀態。
需求
常式 | 必要的標頭 |
---|---|
_set_invalid_parameter_handler , _set_thread_local_invalid_parameter_handler |
C: <stdlib.h> C++: <cstdlib> 或 <stdlib.h> |
和 _set_thread_local_invalid_parameter_handler
函_set_invalid_parameter_handler
式Microsoft特定。 如需相容性資訊,請參閱相容性。
範例
在下列範例中,無效的參數錯誤處理常式是用來列印收到無效參數以及 CRT 來源中檔案和行的函式。 使用偵錯 CRT 連結庫時,無效的參數錯誤也會引發判斷提示,在此範例中使用 _CrtSetReportMode
停用。
// crt_set_invalid_parameter_handler.c
// compile with: /Zi /MTd
#include <stdio.h>
#include <stdlib.h>
#include <crtdbg.h> // For _CrtSetReportMode
void myInvalidParameterHandler(const wchar_t* expression,
const wchar_t* function,
const wchar_t* file,
unsigned int line,
uintptr_t pReserved)
{
wprintf(L"Invalid parameter detected in function %s."
L" File: %s Line: %d\n", function, file, line);
wprintf(L"Expression: %s\n", expression);
abort();
}
int main( )
{
char* formatString;
_invalid_parameter_handler oldHandler, newHandler;
newHandler = myInvalidParameterHandler;
oldHandler = _set_invalid_parameter_handler(newHandler);
// Disable the message box for assertions.
_CrtSetReportMode(_CRT_ASSERT, 0);
// Call printf_s with invalid parameters.
formatString = NULL;
printf(formatString);
}
Invalid parameter detected in function common_vfprintf. File: minkernel\crts\ucrt\src\appcrt\stdio\output.cpp Line: 32
Expression: format != nullptr
另請參閱
_get_invalid_parameter_handler
, _get_thread_local_invalid_parameter_handler
增強安全性的CRT函式版本
errno
、_doserrno
、_sys_errlist
和 _sys_nerr