Compartilhar via


Estratégias para lidar com erros no COM+

Este tópico identifica várias estratégias de tratamento de erros a serem lembradas ao desenvolver componentes para COM+.

  • Retorne um valor HRESULT para todos os métodos em todas as interfaces de componente.  O COM+ usa valores HRESULT para relatar erros ao fazer chamadas de função ou chamadas de método de interface. Um HRESULT indica se um método foi bem-sucedido ou se falhou e identifica o recurso associado ao erro, como RPC, WIN32 ou ITF para erros específicos da interface. Além disso, as APIs do sistema fornecem uma pesquisa de um HRESULT para uma cadeia de caracteres que descreve a condição de erro. O uso de métodos que retornam valores HRESULT é fundamental para componentes bem escritos e são essenciais para o processo de depuração. O Microsoft Visual Basic define automaticamente cada método com um HRESULT como retorno. No Microsoft Visual C++, você deve retornar explicitamente um HRESULT. Para obter informações adicionais sobre HRESULTs, consulte Estrutura de códigos de erro COM.

  • Inicie o objeto de coleção ErrorInfo por qualquer meio que sua ferramenta de desenvolvimento forneça. Os objetos da coleção ErrorInfo geralmente são chamados de exceções COM porque permitem que um objeto passe (ou lance) informações de erro avançadas para seu chamador, mesmo entre limites de apartamento. O valor desse objeto de erro genérico é que ele complementa um HRESULT, estendendo o tipo de informação de erro que você pode retornar a um chamador. Cada objeto de coleção ErrorInfo retorna uma descrição contextual, a origem do erro e o identificador de interface do método que originou o erro. Você também pode incluir ponteiros para uma entrada em um arquivo de ajuda. A automação fornece três interfaces para gerenciar o objeto de erro. Seu componente deve implementar a interface de Automação ISupportErrorInfo para anunciar seu suporte para a coleção ErrorInfo. Quando ocorre um erro, o componente usa a interface de Automação ICreateErrorInfo para inicializar um objeto de erro. Depois que o chamador inspeciona o HRESULT e descobre que a chamada de método falhou, ele consulta o objeto para ver se ele dá suporte à coleção ErrorInfo . Em caso afirmativo, o chamador usará a interface de Automação IErrorInfo para recuperar as informações de erro. Os programadores do Visual Basic têm acesso fácil ao objeto de coleção ErrorInfo, que é exposto por meio do objeto Err. Você pode gerar erros com a função Err Raise e detectar erros com a instrução On Error. A camada de runtime do Visual Basic cuida do mapeamento para você. Se você estiver usando o suporte ao compilador COM do Visual C++, poderá usar a classe _com_raise_error para relatar um erro e a classe _com_error para recuperar informações de erro. O COM+ não propagará exceções tradicionais do C++ como informações de IErrorInfo. Para obter informações adicionais sobre o objeto de coleção ErrorInfo, consulte "Tratamento de erros" no Guia de automação.

    Observação

    O COM requer que todos os objetos da coleção ErrorInfo façam marshaling por valor, o que implica que os os componentes que implementam a interface de Automação IErrorInfo também devem implementar e dar suporte à interface IMarshal. A implementação da interface IMarshal deve dar suporte ao marshaling por valor para o componente.

     

  • Use transações para gerenciar falhas de recursos compartilhados. As transações automáticas podem reduzir significativamente a quantidade de código de tratamento de erros que você deve escrever ao usar gerenciadores de recursos gerenciados por estado. No entanto, as transações não eliminam completamente a necessidade de tratamento de erros. Você ainda precisa retornar códigos de erro de seus métodos de interface e verificar esses códigos de erro no chamador para evitar o trabalho desnecessário em uma transação condenada. Para obter informações adicionais sobre como combinar o tratamento de erros com o processamento de transações, consulte Como acelerar transações notificando o objeto raiz.

  • Gere erros explicitamente. Evite permitir que as informações de erro saiam de um objeto, a menos que o objeto gere explicitamente o erro. Capture todos os erros gerados pela ferramenta e trate-os no código do componente. No mínimo, inclua um manipulador padrão para relatar erros inesperados de maneira consistente.

  • Use o intervalo de erros FACILITY_ITF para relatar erros específicos da interface. Os erros específicos da interface devem estar no intervalo de erros FACILITY_ITF, entre 0x0200 e 0xFFFF. Você pode definir um código de erro personalizado no Visual Basic como um deslocamento de vbObjectError. Use a macro MAKE_HRESULT em C++ para introduzir um código de erro específico da interface, conforme mostrado no exemplo a seguir:

    const HRESULT ERROR_NUMBER = MAKE_HRESULT (SEVERITY_ERROR, FACILITY_ITF, 10);
    

Isolamento de falhas e política de Failfast

Como encontrar a origem de um erro

Como o COM+ modifica os valores de retorno

Interpretação de códigos de erro

Solução de problemas