Como recuperar um código de erro

Assim como acontece com todos os aplicativos, o WMI recebe códigos de erro do sistema operacional Windows.

Ao receber um código de erro, você tem as seguintes opções:

  • Examine o log de eventos.

    O WMI envia mensagens de erro para o serviço de Log de Eventos, que verifica os logs de eventos para ajudar a determinar a causa de um erro. Você pode usar as classes compatíveis com o provedor de Log de Eventos para acessar os logs de eventos programaticamente.

  • Recupere o código de erro normalmente.

    O WMI dá suporte às técnicas padrão para recuperar códigos de erro, que são códigos de erro COM para C++ e objetos de erro nativos, como Objeto Err (VBScript)ou SWbemLastError, se o provedor fornecer informações de erro.

Para obter mais informações, confira Manipular informações de classe e instância.

As seguintes seções serão abordadas neste tópico:

Como tratar um erro com VBScript

Se uma chamada ao WMI por meio da API de Script para WMI causar um erro, você terá as seguintes opções para acessar as informações de erro:

  • Use mecanismos de erro nativos da linguagem de script, por exemplo, no VBScript, use o Objeto Err (VBScript) para dar suporte ao tratamento de erros.
  • Crie um objeto SWbemLastError para obter um relatório de erro.

O script a seguir mostra o uso do Err Object (VBScript) nativo. Quando um valor incorreto para o identificador do processo é fornecido, um erro é gerado.

On Error Resume Next
Set objProcess = GetObject( _
    "winmgmts:root\cimv2:Win32_Process.Handle='one'")
Wscript.Echo Err.Number

Observação

A propriedade Description do Objeto Err (VBScript) está vazia ao se conectar ao WMI por meio do moniker "winmgmts:". No entanto, se você se conectar usando SWbemLocator, a descrição estará disponível.

A tabela a seguir lista as propriedades de Err Object (VBScript).

Propriedade Contém
Descrição
Uma descrição legível e localizada do erro.
Número
HRESULT retornado pela API de Script para WMI.
Origem
Identifique o objeto que gerou o erro.

O script a seguir mostra o uso de um objeto SWbemLastError para obter informações detalhadas de erro. Observe que nem todos os provedores fornecem informações para SWbemLastError. Para obter mais informações sobre códigos de erro no script, confira WbemErrorEnum.

On Error Resume Next
Set obj = GetObject("winmgmts:root\cimv2:Win32_Process.Handle='one'")
Set LastError = createobject("wbemscripting.swbemlasterror")
Wscript.Echo "Operation = " & LastError.operation & VBCRLF & "ParameterInfo = " _
            & LastError.ParameterInfo & VBCRLF & "ProviderName = " & LastError.ProviderName

Como tratar um erro usando C++

Um aplicativo cliente do WMI pode receber erros específicos do COM ou do WMI. Os erros do COM estão em conformidade com a estrutura de códigos de erro do COM. Todas as interfaces do WMI podem retornar um erro específico do COM, exceto as interfaces IWbemContext, IWbemClassObject e IWbemQualifierSet. Para obter mais informações sobre códigos de erro do COM, confira Tratamento de erros. As páginas de referência das interfaces do WMI listam os códigos de erro do WMI apropriados na seção Códigos de Erro.

Um aplicativo cliente deve seguir os padrões COM para verificar o status e códigos de retorno de erro. A principal diferença que você deve escolher é se deseja recuperar o código de erro de uma chamada síncrona, semissíncrona ou assíncrona.

Para acessar mensagens de erro síncronas e semissíncronas usando C++

  1. Recupere as informações de erro com uma chamada para a função COM GetErrorInfo.

    Chame GetErrorInfo imediatamente após um método de interface indicar um erro. Isso inclui qualquer um dos métodos IWbemCallResult que você chama durante o processamento de um processo semissíncrono.

  2. Examine o objeto de erro do COM retornado com uma chamada para o método IErrorInterface::QueryInterface.

    Especifique IID_WbemClassObject para o parâmetro riid na chamada QueryInterface. O método QueryInterface retorna uma instância de uma classe WMI, normalmente __ExtendedStatus.

O WMI não fornece o objeto de erro por meio de GetErrorInfo para uma chamada assíncrona, pois não é possível saber quando ou em qual thread ocorreu a chamada assíncrona. Portanto, o código só pode lidar com erros específicos ou passar a falha de chamada por meio de COM.

Observação

Como o retorno de chamada para o coletor pode não ser retornado no mesmo nível de autenticação exigido pelo cliente, é recomendável que você use comunicação semissíncrona em vez de assíncrona. Para obter mais informações, confira Como chamar um método.

Para acessar mensagens de erro assíncronas usando C++

  • Recupere o objeto de erro do COM na implementação de IWbemObjectSink::SetStatus.

    O pseudocódigo a seguir mostra uma implementação típica de tratamento de erros para um aplicativo cliente.

    HRESULT hRes = SomeMethod;
    
    // Check for specific error and status codes.
    if (hRes == WBEM_E_NOT_FOUND)
    {
    // Processing to handle specific error code
    }
    else if hRes == WBEM_S_DUPLICATE_OBJECTS
    {
    // All other cases, including errors specific to COM
    }
    else if (FAILED(hRes))
    {
    
    }