对齐消息时的异常消息最佳做法

时间:2015-06-10 10:49:14

标签: c# .net exception

我们有一个异常库,预计将用于多个解决方案。我们在这个库中包含了几个自定义异常类型。

出现的问题:如果我们想要对齐这些异常中使用的错误消息,那么实现此目的的最佳实践方法是什么?对于这个问题,假设解决方案中有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 /另一种选择?

1 个答案:

答案 0 :(得分:1)

使用第一种方法。您的异常应该封装构建错误消息。通过构造函数异常应该只接收来自外部世界的上下文特定信息。如果您的异常通过构造函数接收完整的错误消息,那么客户端可以创建异常的实例,如下所示:

class InvalidEmailException : Exception
{
   public InvalidEmailException(string message) : base(message)
   {}
}

客户代码:

void ClientMethod()
{
   throw new InvalidEmailException(String.Format("GUID {0} is wrong", Guid.NewGuid()));
}

但是等等,我希望电子邮件在这个例外!

异常构建器的方法是过度工程,只需使用第一种方法:)