Compartilhar via


_set_invalid_parameter_handler, _set_thread_local_invalid_parameter_handler

Define a função a ser chamada quando o CRT detecta um argumento inválido.

Sintaxe

_invalid_parameter_handler _set_invalid_parameter_handler(
   _invalid_parameter_handler pNew
);
_invalid_parameter_handler _set_thread_local_invalid_parameter_handler(
   _invalid_parameter_handler pNew
);

Parâmetros

pNew
O ponteiro de função para o novo manipulador de parâmetro inválido.

Valor retornado

Um ponteiro para o manipulador de parâmetro inválido antes da chamada.

Comentários

Muitas funções em runtime C verificam a validade dos argumentos passados para elas. Se um argumento inválido for passado, a função poderá definir o número de erro errno ou retornar um código de erro. Nesses casos, o manipulador de parâmetro inválido também é chamado. O runtime C fornece um manipulador de parâmetro inválido global padrão que encerra o programa e exibe uma mensagem de erro de runtime. Você pode usar o _set_invalid_parameter_handler para definir sua própria função como o manipulador de parâmetro inválido global. O runtime C também dá suporte a um manipulador de parâmetro inválido local de thread. Se um manipulador de parâmetro local de thread é definido em um thread usando _set_thread_local_invalid_parameter_handler, as funções em runtime C chamadas do thread usam esse manipulador em vez do manipulador global. Apenas uma função por vez pode ser especificada como o manipulador de argumento inválido global. Apenas uma função por thread pode ser especificada como o manipulador de argumento inválido local de thread, mas threads diferentes podem ter diferentes manipuladores locais de thread. Os manipuladores locais de thread permitem que você altere o manipulador usado em uma parte do código sem afetar o comportamento de outros threads.

Quando o runtime chama a função de parâmetro inválido, isso normalmente significa que ocorreu um erro irrecuperável. A função de manipulador de parâmetro inválido fornecida por você deve salvar todos os dados que puder e, em seguida, anular. Ele não deve retornar o controle para a função principal, a menos que você tenha certeza de que o erro é recuperável.

A função de manipulador de parâmetro inválido deve ter o seguinte protótipo:

void _invalid_parameter(
   const wchar_t * expression,
   const wchar_t * function,
   const wchar_t * file,
   unsigned int line,
   uintptr_t pReserved
);

O argumento expression é uma representação de cadeia de caracteres largos da expressão do argumento que gerou o erro. O argumento function é o nome da função CRT que recebeu o argumento inválido. O argumento file é o nome do arquivo de origem CRT que contém a função. O argumento line é o número de linha nesse arquivo. O último argumento é reservado. Todos os parâmetros têm o valor NULL, exceto quando uma versão de depuração da biblioteca CRT é usada.

Por padrão, o estado global dessa função tem como escopo o aplicativo. Para alterar esse comportamento, confira Estado global no CRT.

Requisitos

Rotina Cabeçalho necessário
_set_invalid_parameter_handler, _set_thread_local_invalid_parameter_handler C: <stdlib.h>

C++: <cstdlib> ou <stdlib.h>

As funções _set_invalid_parameter_handler e _set_thread_local_invalid_parameter_handler são específicas da Microsoft. Para obter informações sobre compatibilidade, consulte Compatibilidade.

Exemplo

No exemplo a seguir, um manipulador de erro de parâmetro inválido é usado para imprimir a função que recebeu o parâmetro inválido e o arquivo e a linha em fontes de CRT. Quando a biblioteca CRT de depuração é usada, erros de parâmetro inválidos também geram uma asserção, que é desabilitada neste exemplo usando _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

Confira também

_get_invalid_parameter_handler, _get_thread_local_invalid_parameter_handler
Versões aprimoradas de segurança das funções CRT
errno, _doserrno, _sys_errlist e _sys_nerr