2010-03-19 69 views
1

因此,我们正在开发此产品的几个人正在与一个非常不稳定的服务器进行通信。它通常会返回非常奇怪和损坏的数据。在测试过程中,我们希望产生的崩溃声很大,所以我们发现它们。但是隔天我们需要向潜在客户展示我们的产品。对于客户来说,如果我们只是吞下它们,这些错误将不会被发现。我想实现这样的周围的所有服务器进行通信的东西吞咽异常和崩溃之间快速切换:控制是否有异常被静态布尔值吞噬

try { 
    apiCall(); 
} catch (Exception e) { 
    if(!SWALLOW_EXCEPTION) { 
     throw e; 
    } 
} 

这是一个真棒想法,或者可以将其以更好的方式来完成?

+6

有没有不道德的标签? – 2010-03-19 15:43:54

+0

第二个try/catch块没有意义。你可以直接调用'e.printStackTrace()'。 – 2010-03-19 15:49:52

+0

现在有。 :-) – 2010-03-19 15:49:54

回答

6

我会推荐使用类似SLF4J,java.util.logging或Log4j的Logger。任何'调试'的日志消息,但您仍然需要跟踪您可以根据其严重性进入DEBUG,INFO或WARN级别。您可以保存“错误”级别的实际错误。

当您向客户进行演示时,将您的日志级别设置为错误,以便他们看不到所有内容。在正常运行时,将其设置为一个级别以捕获所需的日志记录级别。

吞咽异常从来不是一个好的做法。通过使用记录器,如果它给你太多细节,你可以隐藏它们。你可以随时访问它们,如果你需要而不需要重新编译。

+0

谢谢,我会试试这个。 – pgsandstrom 2010-03-19 16:02:58

2

这并不漂亮。如何实现顶级(无论在你的上下文中意味着什么)错误处理程序[s]那么做?

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); 
    } 

但我想大多数人在寻找这样的一段代码会非常吃惊。如果你想避免重新编译,只需使用一个系统属性:

if (Boolean.getBoolean("development")) { 
     throw e; 
} else { 
     e.printStackTrace();//you should really use a logging framework anyway and not this. 
}