Con nuestro SDK público, tendemos a querer dar mensajes muy informativos sobre por qué ocurre una excepción. Por ejemplo:
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);
}
Sin embargo, esto tiende a saturar el flujo del código, ya que tiende a centrarse mucho en los mensajes de error en lugar de en lo que está haciendo el código.
Un colega comenzó a refactorizar algunas de las excepciones lanzando algo como esto:
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);
}
Lo que hace que la lógica del código sea más fácil de entender, pero agrega muchos métodos adicionales para manejar los errores.
¿Cuáles son otras formas de evitar el problema de "lógica de desorden de mensajes largos de excepción"? Principalmente estoy preguntando acerca de C # / .NET idiomático, pero también es útil cómo lo manejan otros lenguajes.
[Editar]
Sería bueno tener los pros y los contras de cada enfoque también.
Exception.Data
propiedad, la captura de excepciones "selectivas", la captura del código de llamada y la adición de su propio contexto, junto con la pila de llamadas capturadas, contribuyen con información que debería permitir mensajes mucho menos detallados. Finalmente System.Reflection.MethodBase
parece prometedor para proporcionar detalles para pasar a su método de "construcción de excepción".
Exception.Data
. El énfasis debe ser capturar la telemetría. Refactorizar aquí está bien, pero pierde el problema.