Como lidar com erros assíncronos do Configuration Manager usando código gerenciado

Para lidar com um erro do Configuration Manager gerado durante uma consulta assíncrona, teste a RunWorkerCompletedEventArgs propriedade Error Exception do parâmetro que é passada para o manipulador de eventos SmsBackgroundWorker.QueryProcessorCompleted. Se o erro não nullfor, ocorreu uma exceção e você usará o erro para descobrir a causa.

Se Error for um SmsQueryException, você poderá usá-lo para acessar o ou SMS_ExtendedExceptionsubjacente__ExtendedException. Como a biblioteca do provedor SMS gerenciado não encapsula essas exceções, você precisará usar o objeto System.Management, namespace ManagementException , para acessá-las.

Para lidar com um erro de consulta assíncrona

  1. Crie uma consulta assíncrona.

  2. No manipulador de eventos de consulta assíncrona SmsBackgroundWorker.QueryProcessorCompleted , implemente o código no exemplo a seguir.

  3. Execute a consulta assíncrona. Para testar o manipulador de exceção, passe uma cadeia de caracteres de consulta mal formada, como Select & from &&& o método QueryProcessorBase.ProcessQuery .

Exemplo

O exemplo a seguir implementa um manipulador de eventos SmsBackgroundWorker.QueryProcessorCompleted .

Para obter informações sobre como chamar o código de exemplo, consulte Chamando trechos de código do Configuration Manager.

void bw1_QueryProcessorCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Error != null)
    {
        Console.WriteLine("There was an Error");
        if (e.Error is SmsQueryException)
        {
            SmsQueryException queryException = (SmsQueryException)e.Error;
            Console.WriteLine(queryException.Message);

            // Get either the __ExtendedStatus or SMS_ExtendedStatus object and display various properties.
            ManagementException mgmtExcept = queryException.InnerException as ManagementException;

            if (mgmtExcept != null)
            {
                if (string.Equals(mgmtExcept.ErrorInformation.ClassPath.ToString(), "SMS_ExtendedStatus", StringComparison.OrdinalIgnoreCase) == true)
                {
                    Console.WriteLine("Configuration Manager provider exception");
                }

                else if (string.Equals(mgmtExcept.ErrorInformation.ClassPath.ToString(), "__ExtendedStatus", StringComparison.OrdinalIgnoreCase) == true)
                {
                    Console.WriteLine("WMI exception");
                }
                Console.WriteLine(mgmtExcept.ErrorCode.ToString());
                Console.WriteLine(mgmtExcept.ErrorInformation["ParameterInfo"].ToString());
                Console.WriteLine(mgmtExcept.ErrorInformation["Operation"].ToString());
                Console.WriteLine(mgmtExcept.ErrorInformation["ProviderName"].ToString());
            }

        }
        if (e.Error is SmsConnectionException)
        {
            Console.WriteLine("There was a connection error :" + ((SmsConnectionException)e.Error).Message);
            Console.WriteLine(((SmsConnectionException)e.Error).ErrorCode);
        }
    }

    Console.WriteLine("Done...");
}

O método de exemplo tem os seguintes parâmetros:

Parâmetro Tipo Descrição
sender - Object A origem do evento.
e - RunWorkerCompletedEventArgs Os dados do evento.

Para obter mais informações, consulte RunWorkerCompletedEventArgs Class.

Compilando o código

Este exemplo do C# exige:

Namespaces

System

System.Collections.Generic

System.Text

Microsoft.ConfigurationManagement.ManagementProvider

Microsoft.ConfigurationManagement.ManagementProvider.WqlQueryEngine

System.Management

System.ComponentModel

Assembly

Microsoft.ConfigurationManagement.ManagementProvider

adminui.wqlqueryengine

System.Management

Programação robusta

Para obter mais informações sobre o tratamento de erros, consulte Sobre erros do Configuration Manager.

Confira também

Sobre erros