代码之家  ›  专栏  ›  技术社区  ›  pgsandstrom

控制静态布尔值是否接受异常

  •  1
  • pgsandstrom  · 技术社区  · 15 年前

    所以我们是一些开发这个产品的人,它正在与一个非常不稳定的服务器通信。它经常返回非常奇怪和损坏的数据。在测试过程中,我们希望结果崩溃的声音很大,所以我们发现了它们。但每隔一天,我们都需要向潜在客户展示我们的产品。对于客户来说,如果我们吞下这些错误,就会发现它们。我正在考虑围绕所有服务器通信实现类似的功能,以便在吞咽异常和崩溃之间快速切换:

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

    这是一个很棒的主意,还是可以用更好的方式来实现?

    4 回复  |  直到 15 年前
        1
  •  6
  •   Chris Dail    15 年前

    我建议使用像 SLF4J ,java.util.logging或 Log4j . 任何正在“调试”但仍希望跟踪的日志消息,可以根据其严重性将其置于调试、信息或警告级别。您可以为“错误”级别保存实际错误。

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

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

        2
  •  2
  •   David Soroko    15 年前

    这不漂亮。如何实现一个顶级(在您的上下文中是什么意思)错误处理程序来实现这个功能?

        3
  •  0
  •   Yishai    15 年前

    你打算用你的代码来做这个吗?

       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.
     }
    
        4
  •  0
  •   Chris Dennett    15 年前

    您可以改用“未捕获的异常处理程序”。查看代码 http://stuffthathappens.com/blog/2007/10/07/programmers-notebook-uncaught-exception-handlers/ http://www.javapractices.com/topic/TopicAction.do?Id=229 . 还可以编写处理程序将异常放入日志记录器中。