在 Java 中,将有用的状态信息传递给异常的好方法是什么?
我注意到最初对我的问题有些困惑。我不是在问如何配置记录器,也不是在问如何正确使用记录器,而是如何捕获在低于异常消息中当前日志记录级别的日志记录级别记录的所有信息。
我注意到Java中有两种模式用于记录信息,当发生异常时,这些信息可能对开发人员有用。
以下模式似乎很常见。基本上,您只需根据需要将记录器日志信息内联,以便在发生异常时,您就拥有了日志跟踪。
try {
String myValue = someObject.getValue();
logger.debug("Value: {}", myValue);
doSomething(myValue);
}
catch (BadThingsHappenException bthe) {
// consider this a RuntimeException wrapper class
throw new UnhandledException(bthe);
}
上述方法的缺点是,如果您的用户需要相对安静的日志,并且需要高级别的可靠性,以至于他们无法“在调试模式下重试”,则异常消息本身包含的数据不足,无法对开发人员有用。
下一个模式是我见过的一个试图缓解这个问题但看起来很丑陋的模式:
String myValue = null;
try {
myValue = someObject.getValue();
doSomething(myValue);
}
catch (BadThingsHappenException bthe) {
String pattern = "An error occurred when setting value. [value={}]";
// note that the format method below doesn't barf on nulls
String detail = MessageFormatter.format(pattern, myValue);
// consider this a RuntimeException wrapper class
throw new UnhandledException(detail, bthe);
}
上面的模式似乎在某种程度上解决了这个问题,但是,我不确定我是否喜欢在try块的范围之外声明这么多变量。特别是,当我必须处理非常复杂的状态时。
我见过的唯一另一种方法是使用Map来存储键值对,然后将这些键值对转储到异常消息中。我不确定我是否喜欢这种方法,因为它似乎会产生代码膨胀。
有没有一些Java巫毒教,我错过了?如何处理异常状态信息?