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.
}
Tópicos relacionados