我们有一个异常库,预计将用于多个解决方案。我们在这个库中包含了几个自定义异常类型。
出现的问题:如果我们想要对齐这些异常中使用的错误消息,那么实现此目的的最佳实践方法是什么?对于这个问题,假设解决方案中有3种或4种方法想要抛出这些类型的异常。
让我们举个例子:
public class CustomException : Exception
{
// You can assume that we've covered the other default constructors for exceptions
public CustomException(string message)
: base(message)
{
}
}
我们想要替换的工作:
public void DoWork()
{
Guid id = Guid.NewGuid();
// ...
throw new CustomException(string.Format("The guid was: {0}.", id));
}
我们目前的想法
1 /定义一个接受定义错误消息的guid的新构造函数:
const string GuidMessageTemplate = "The guid was: {0}.";
public CustomException(Guid id)
: base(string.format(GuidMessageTemplate, id))
{
}
public void DoWork()
{
Guid id = Guid.NewGuid();
// ...
throw new CustomException(id);
}
2 /允许每个解决方案定义实例化一致异常的异常构建器类/方法
public class ExceptionBuilder()
{
const string GuidMessageTemplate = "The guid was: {0}.";
public CustomException BuildCustomException(Guid id)
{
return new CustomException(string.format(GuidMessageTemplate, id));
}
}
public void DoWork()
{
Guid id = Guid.NewGuid();
// ...
var exception = BuildCustomException(id);
throw exception;
}
3 /另一种选择?
答案 0 :(得分:1)
使用第一种方法。您的异常应该封装构建错误消息。通过构造函数异常应该只接收来自外部世界的上下文特定信息。如果您的异常通过构造函数接收完整的错误消息,那么客户端可以创建异常的实例,如下所示:
class InvalidEmailException : Exception
{
public InvalidEmailException(string message) : base(message)
{}
}
客户代码:
void ClientMethod()
{
throw new InvalidEmailException(String.Format("GUID {0} is wrong", Guid.NewGuid()));
}
但是等等,我希望电子邮件在这个例外!
异常构建器的方法是过度工程,只需使用第一种方法:)