Com nosso SDK público, tendemos a enviar mensagens muito informativas sobre o motivo de uma exceção. Por exemplo:
if (interfaceInstance == null)
{
string errMsg = string.Format(
"Construction of Action Argument: {0}, via the empty constructor worked, but type: {1} could not be cast to type {2}.",
ParameterInfo.Name,
ParameterInfo.ParameterType,
typeof(IParameter)
);
throw new InvalidOperationException(errMsg);
}
No entanto, isso tende a atrapalhar o fluxo do código, pois tende a colocar muito foco nas mensagens de erro, e não no que o código está fazendo.
Um colega começou a refatorar algumas das exceções lançando algo assim:
if (interfaceInstance == null)
throw EmptyConstructor();
...
private Exception EmptyConstructor()
{
string errMsg = string.Format(
"Construction of Action Argument: {0}, via the empty constructor worked, but type: {1} could not be cast to type {2}.",
ParameterInfo.Name,
ParameterInfo.ParameterType,
typeof(IParameter)
);
return new InvalidOperationException(errMsg);
}
O que facilita a compreensão da lógica do código, mas adiciona muitos métodos extras para o tratamento de erros.
Quais são as outras maneiras de evitar o problema da "lógica de confusão de mensagens de exceção longa"? Estou perguntando principalmente sobre C # /. NET idiomático, mas como outros idiomas o gerenciam também são úteis.
[Editar]
Seria bom ter os prós e contras de cada abordagem também.
Exception.Data
propriedade, captura "exigente" de exceção, captura de código e adição de seu próprio contexto, juntamente com a pilha de chamadas capturadas, contribuem com informações que devem permitir mensagens muito menos detalhadas. Finalmente, System.Reflection.MethodBase
parece promissor fornecer detalhes para passar ao seu método de "construção de exceção".
Exception.Data
. A ênfase deve ser a captura de telemetria. Refatorar aqui é bom, mas perde o problema.