Поделиться через


_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, вызванные из потока, используют этот обработчик вместо глобального обработчика. Только одну функцию можно указать в качестве глобального обработчика недопустимых аргументов единовременно. Только одну функцию можно указать в качестве локального обработчика недопустимых аргументов для одного потока, но различные потоки могут иметь разные локальные обработчики потоков. Локальные обработчики потоков позволяют изменять обработчик, используемый в одной части кода, не влияя на поведение других потоков.

Когда среда выполнения вызывает функцию обработки недопустимого параметра, это обычно означает, что возникла неисправимая ошибка. Указанная функция обработчика недопустимого параметра должна сохранить все данные, которые возможно сохранить, и затем прерваться. Он не должен возвращать контроль в основную функцию, если вы не уверены, что ошибка будет восстановлена.

Функция обработчика недопустимого параметра должна иметь следующий прототип:

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 — номер строки в этом файле. Последний аргумент зарезервирован. Все параметры имеют значение NULL, если не используется отладочная версия библиотеки CRT.

По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью "Глобальное состояние" в 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 относятся к корпорации Майкрософт. Дополнительные сведения о совместимости см. в разделе Совместимость.

Пример

В следующем примере обработчик ошибок недопустимого параметра используется для печати функции, которая получила недопустимый параметр, и файла и строки в источниках 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