Tratamento de erros e valores retornados
VSPackages e COM usam a mesma arquitetura para erros. As SetErrorInfo
funções and GetErrorInfo
fazem parte da API (interface de programação de aplicativo) do Win32. Qualquer VSPackage no IDE (ambiente de desenvolvimento integrado) pode chamar essas APIs globais do Win32 para registrar informações de erro avançadas ao receber uma notificação de erro. O SDK do Visual Studio fornece assemblies de interoperabilidade para gerenciar informações de erro.
Métodos de interoperabilidade
Como conveniência, o IDE fornece um método, SetErrorInfo, para usar em vez de chamar as APIs do Win32. No código gerenciado, use SetErrorInfo. Quando um erro HRESULT
chega ao nível em que a mensagem de erro deve ser exibida (geralmente é o objeto que implementa um IOleCommandTarget manipulador de comandos), o IDE usa outro método, ReportErrorInfo, para exibir a caixa de mensagem apropriada. No código gerenciado, use o ReportErrorInfo método.
Como um implementador VSPackage, seus objetos COM normalmente implementam ISupportErrorInfo
. A ISupportErrorInfo
interface garante que informações de erro avançadas possam se mover verticalmente para cima na cadeia de chamadas. Os objetos que podem ser usados entre processos ou threads devem dar suporte ISupportErrorInfo
para garantir que as informações de erro avançadas sejam empacotadas corretamente de volta para o chamador.
Todos os objetos relacionados a VSPackages e que estão envolvidos na extensão do IDE, incluindo fábricas de editores, editores, hierarquias e serviços oferecidos, devem oferecer suporte a informações de erro avançadas. Embora o IDE não exija que esses objetos VSPackage sejam implementados ISupportErrorInfo
, ele é sempre incentivado.
O IDE é responsável por relatar informações de erro e exibi-las a um usuário do Visual Studio sempre que um HRESULT
é propagado para o IDE. O IDE também é o mecanismo para criar ErrorInfo
objetos.
Diretrizes gerais
Você também pode usar os SetErrorInfo métodos and ReportErrorInfo para definir e relatar erros internos à implementação do VSPackage. No entanto, como regra geral, siga estas diretrizes para lidar com mensagens de erro em seu VSPackage:
Implemente
ISupportErrorInfo
em seus objetos COM VSPackage.Crie um mecanismo de relatório de erros que chame o SetErrorInfo método em objetos que implementam IOleCommandTarget.
Deixe o IDE exibir erros para os usuários por meio do ReportErrorInfo método.
Informações de erro no IDE
As regras a seguir indicam como lidar com informações de erro no IDE do Visual Studio:
Como uma estratégia defensiva para garantir que informações de erro obsoletas não sejam relatadas aos usuários, as funções que chamam o ReportErrorInfo método devem primeiro chamar o SetErrorInfo método. Passe para limpar as mensagens de erro armazenadas em
null
cache antes de chamar qualquer coisa que possa definir novas informações de erro.As funções que não relatam mensagens de erro diretamente só têm permissão para chamar o SetErrorInfo método se estiverem retornando um erro
HRESULT
. É permitido limpar oErrorInfo
na entrada de uma função ou ao retornar S_OK. A única exceção a essa regra é quando uma chamada retorna um erroHRESULT
do qual a parte receptora pode se recuperar explicitamente ou ignorar com segurança.Qualquer parte que ignore explicitamente um erro
HRESULT
deve chamar o SetErrorInfo método com S_OK. Caso contrário, oErrorInfo
objeto pode ser usado acidentalmente quando outra parte gerar um erro sem fornecer seu próprioErrorInfo
.Todos os métodos que originam um erro
HRESULT
são incentivados a chamar o SetErrorInfo método para fornecer informações de erro avançadas. Se o retornadoHRESULT
for um erro especialFACILITY_ITF
, o método será necessário para fornecer um objeto adequadoErrorInfo
. Se o erro retornado for um erro padrão do sistema (por exemplo, E_OUTOFMEMORY, E_ABORT, , E_UNEXPECTEDE_INVALIDARG, e assim por diante), é aceitável retornar o código de erro sem chamar explicitamente o SetErrorInfo método. Como estratégia de codificação defensiva, ao originar um erroHRESULT
(incluindo erros do sistema), sempre chame o SetErrorInfo método, seja descrevendoErrorInfo
a falha com mais detalhes ounull
.Todas as funções que retornam um erro originado por outra chamada devem passar as informações que foram recebidas da chamada com falha no
HRESULT
sem modificar oErrorInfo
objeto.