【问题标题】:how do I log crash to the server without try-catch block?如何在没有 try-catch 块的情况下将崩溃记录到服务器?
【发布时间】:2020-08-07 11:09:39
【问题描述】:

我不明白什么时候使用try-catch,它们有什么问题,特别是这个项目(57 java-effective) 有人可以解释一下吗

 // Horrible abuse of exceptions. Don't ever do this!
try {
   int i = 0;
   while(true)
      range[i++].climb();
} catch(ArrayIndexOutOfBoundsException e) {
}

for (Mountain m : range)
   m.climb();

“因为异常是为异常情况而设计的,所以 JVM 实现者几乎没有动力让它们像显式测试一样快。 将代码放在 try-catch 块中会抑制现代 JVM 实现可能执行的某些优化。 循环遍历数组的标准习语不一定会导致冗余检查。现代 JVM 实现将它们优化掉。”

最后,如果我们不能在每个块中使用 try-catch,我如何在没有 catch 块的情况下将崩溃记录到服务器

【问题讨论】:

  • 它并没有说不要使用 try-catch 块。它说不要使用它们来代替“显式测试”。即在这种情况下使用传统的 for 循环 for (int i = 0; i < range.length; ++i)。这不是一个很好的例子。本质上,他们的目的是不将异常用于正常的流量控制,而仅用于异常所有情况。
  • 我发布了一个带有解释和示例的答案,对您有帮助吗?
  • @Steyrix 谢谢你,但你没有回答我所有的问题
  • 您的意思是“如何在没有 catch 块的情况下将崩溃记录到服务器”?因为这是我唯一没有回答的问题
  • 请说明您的问题,以便我们为您提供帮助

标签: java try-catch effective-java


【解决方案1】:

可以使用 try-catch,但你不应该滥用它。避免exception-driven development

您应该只使用 try-catch 来捕获您作为开发人员无法预测的异常,例如 - 从服务器获取无效响应(因为您不负责后端,所以您对服务器的实现及其“一无所知”响应发送机制)。

在上面的示例中,处理ArrayIndexOutOfBoundException 毫无意义,因为您可以通过将while-loop 条件重写为while(i < range.size() - 1) 或根本不使用while-loop 而使用for 来避免异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    相关资源
    最近更新 更多