如何记录前置条件检查时抛出的异常

时间:2012-03-02 05:33:42

标签: java guava

我有兴趣在我的应用程序中使用Guava库。 特别适用于前置条件和参数检查。

但是,虽然Preconditions检查它会抛出控制台上显示的运行时异常。 我想记录这个例外。 任何人都可以告诉我该怎么做。

提前感谢。

3 个答案:

答案 0 :(得分:1)

以下是伪代码

try
{
Precondition.(...);
}
catch(RuntimeException re)
{
//log the exception here
//rethrow re
}

答案 1 :(得分:1)

我真的看不到,让RuntimeException的源执行日志记录会有什么好处......当你使用Preconditions时,你可以通过说“如果你的值为null则不能通过”来保护你的内部实现(或者如果你的长度大于x,或者......)。你这样做,因为你不想在代码中稍后处理这些约束。

每当使用非法值调用方法时,调用者立即获得RuntimeException,希望包含有用的消息(“setName():name不能为null!”)。 现在由调用者来决定如何处理这些信息。有时,您希望将消息委派给用户(“请输入正确的名称”),有时您必须记录错误,因为您有配置问题(名称应该由系统属性设置)。

我的结论:只需使用checkArgument(),并让调用者(客户端)处理处理,记录等。请记住,在实现中不需要任何进一步的代码。

答案 2 :(得分:0)

如果你使用前置条件作为断言(而不是输入验证),我认为在源代码中记录违反前提条件是有意义的(假设你的代码中有编程错误,并且你不能总是相信你的中间代码表现良好...: - )

如果是这样,你可能有兴趣看一下使用hamcrest-matchers的valid4j(在Maven Central上找到org.valid4j:valid4j)

对于前置条件和后置条件(即断言抛出AssertionError()):

import static org.valid4j.Assertive.*;

require(argument, notNullValue());
require(x, greaterThan(0));
...
ensure(result, isValid());

不幸的是,默认实现不会记录错误,但您可以覆盖AssertiveProvider来记录合同违规并将其注册为ServiceLoader,即在META-INF / services中。

详见: