我有一个带有异常变量作为参数的方法。除了默认值之外,此异常有时可以继承自定义异常中的其他值,我想知道如何在不转换为自定义异常对象或验证HResult
的情况下访问这些自定义值(这将永远是相同的到期)如何方法的论点。)
例如,在某些情况下,异常对象可以继承列表,但我无法访问此列表。要使此方法返回正确的值,我必须首先找到识别异常的方法,并且通过访问继承的值,我将能够。
这是我到目前为止所尝试的:
- 异常处理方法 -
private string ExceptionHandler(Exception ex)
{
var customExceptionMessages = string.Empty;
//I want to avoid this
var customException = ex as CustomException;
if (customException != null)
{
//Build custom exception message
foreach (var v in customException.CustomViolations)
{
customExceptionMessages += v.ErrorMessage + "<br />";
}
return customExceptionMessages;
}
else
return ex.Message;
}
- 使用示例 -
ExceptionHandler(customEx);
调试后,我注意到在ExceptionHandler
运行之前,customEx
有其用户定义的值。 ExceptionHandler
开始运行后,ex
会继承异常的默认值和自定义值。我不能只说ex.CustomViolations
因为它只在运行时存在。
答案 0 :(得分:5)
覆盖自定义异常类中的属性Message
,并在属性getter中构建所需的消息字符串。完成后,您只需返回ex.Message
,就不必担心异常类型。
public class CustomException : Exception
{
public override string Message
{
get
{
return <build message here>;
}
}
}
答案 1 :(得分:2)
通常使用Visitor pattern来实现此类目标。但是,在这里您无法修改Exception
的源代码。幸运的是,在C#中,您可以使用dynamic
关键字来执行此操作:
private string ExceptionHandler(ConcreteException1 ex)
//...
private string ExceptionHandler(ConcreteException2 ex)
//...
private string ExceptionHandler(Exception ex) // default
x.ExceptionHanlder((dynamic)ex); // will call an appropriate overload
当然,在内部进行类型检查,但解决方案是可扩展的 - 您唯一需要的是为每个新的异常类型添加另一个重载。
在您没有/不想要dynamic
类型的情况下,另一种方法是为每个例外使用具体处理程序的字典:
Dictionary<Type, ExceptionHandler> handlers = ...
handlers[ex.GetType()].Handle(ex);
(在这个例子中,我已将ExceptionHandler
更改为类名,并使用Handle
作为方法名称 - 这是命名方法的首选,较少混淆的方法类型;))
您还可以使用一些通用方法魔法来避免在Handle
方法中进行转换,但即使没有这种方法,您也不必检查无效的转换。