因此,我们是一些开发此产品的人正在与一个非常不稳定的服务器进行通信。它经常返回非常奇怪和损坏的数据。在测试期间,我们希望产生的崩溃是响亮的,所以我们发现它们。但是每隔一天我们都需要向潜在客户展示我们的产品。如果我们只是吞下它们,那么错误就会被发现。我正在考虑围绕所有服务器通信实现类似的功能,以便在吞咽异常和崩溃之间快速切换:
try {
apiCall();
} catch (Exception e) {
if(!SWALLOW_EXCEPTION) {
throw e;
}
}
这是一个很棒的想法,还是可以更好的方式完成?
答案 0 :(得分:6)
我建议使用像SLF4J,java.util.logging或Log4j这样的记录器。任何“调试”但仍需要跟踪的日志消息都可以根据其严重性设置为DEBUG,INFO或WARN级别。您可以为“错误”级别保存的实际错误。
当您对客户进行演示时,请将日志级别设置为“错误”,这样他们就看不到所有内容。但是,当您正常运行时,请将其设置为捕获所需日志记录级别的级别。
吞咽异常绝不是一种好习惯。通过使用记录器,如果它给你太多细节,你可以隐藏它们。如果您需要,无需重新编译,您始终可以访问它们。
答案 1 :(得分:2)
这不太好看。如何实现顶级(在您的上下文中意味着什么)错误处理程序[s]这样做?
答案 2 :(得分:0)
您是否打算使用代码执行此操作?
try {
apiCall();
} catch (Exception e) {
if(!SWALLOW_EXCEPTION) {
throw e;
} else {
e.printStackTrace();
}
}
如果是这样,如果这是调用此API的唯一地方,那么对我来说似乎没问题,只要您意识到需要重新编译才能使更改生效。您可以滥用日志框架来完成这项工作,而无需像这样重新编译:
if (logger.isInfoEnabled()) {
throw e;
} else {
logger.error(e.getMessage(), e);
}
但我认为大多数人看着这样的代码都会非常吃惊。如果要避免重新编译,只需使用System属性:
if (Boolean.getBoolean("development")) {
throw e;
} else {
e.printStackTrace();//you should really use a logging framework anyway and not this.
}
答案 3 :(得分:0)
您可以使用“未捕获的异常处理程序”代替。查看http://stuffthathappens.com/blog/2007/10/07/programmers-notebook-uncaught-exception-handlers/和http://www.javapractices.com/topic/TopicAction.do?Id=229处的代码。您还可以编写处理程序以将异常放入记录器中。