_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