Manipulando erros desconhecidos

É legal retornar um código de status apenas a partir da implementação de um método de interface sancionado como legalmente retornável. A não observância dessa regra abre a possibilidade de conflito entre os valores de código de erro retornados e aqueles sancionados pelo aplicativo. Preste especial atenção a esse problema potencial ao propagar códigos de erro de funções que são chamadas internamente.

Os aplicativos que chamam interfaces devem tratar qualquer código de erro retornado desconhecido (em oposição a um código de êxito) como sinônimo de E_UNEXPECTED. Essa prática de lidar com códigos de erro desconhecidos é exigida pelos clientes das interfaces e funções definidas pelo COM. Como a prática típica de programação é lidar com alguns códigos de erro específicos em detalhes e tratar o resto genericamente, esse requisito de lidar com códigos de erro inesperados ou desconhecidos é facilmente atendido.

É importante lidar com todos os erros possíveis ao chamar um método de interface. Se isso não for feito, o aplicativo poderá falhar, corromper dados ou ficar vulnerável a explorações de segurança. O exemplo de código a seguir mostra a maneira recomendada de lidar com erros desconhecidos:

HRESULT hr; 
hr = xxMethod(); 
 
switch (GetScode(hr))  
{ 
    case NOERROR: 
      // Method returned success. 
      break; 
 
    case x1: 
      // Handle error x1 here.
      break; 
 
    case x2: 
      // Handle error x2 here.
      break; 
 
    case E_UNEXPECTED: 
    default: 
      // Handle unexpected errors here. 
      break; 
} 
 

A seguinte verificação de erros é frequentemente usada com as rotinas que não retornam nada especial (exceto S_OK ou algum erro inesperado):

if (xxMethod() == NOERROR) 
{
    // Handle success here.
} 
else 
{
    // Handle failure here.
} 

Tratamento de erro em COM