java - 有一个 try-catch block ,你应该把所有的语句都放在里面还是只放不安全的?

标签 java exception-handling

假设 save 抛出并且 i 仅用于 save。以下代码片段是否相同?请考虑语义、性能和其他方面。

void bob(){
  int i = calculate();
  try {
    save(i);
  } catch(Exception e){
    report(e)
  }
}

对比

void bob(){
  try {
    int i = calculate();
    save(i);
  } catch(Exception e){
    report(e)
  }
}

一般来说,我想知道,是应该将一个函数的所有语句都放在 try-catch block 中,还是只放在一个抛出的语句中。

最佳答案

在语义方面,如果您已经决定要将 try-catch 构造放入哪个方法(并且您对自己做出的正确决定感到满意),那么答案很简单:

  • 您应该在try block 中包含一系列语句,这样,如果其中一个语句失败,则应放弃该序列的其余部分。不多也不少。

如果您正确遵循上述建议,所需的程序流程和最有效的局部变量作用域等问题将非常容易和明显地解决(在大多数情况下)。您会注意到,这并不排除嵌套 try block 的可能性。

性能方面,异常处理的开销在于实际抛出和捕获可抛出对象。换句话说,只有在实际发生异常时才会真正产生开销。仅在代码中存在 try-catch 构造不会引入任何可测量的开销(可能根本没有)。此外,语句的数量(在给定的 try-catch 构造内)与其性能完全无关。

编辑: 我无法在 JVM 规范中找到任何可链接的详细信息,但用户有很多帖子检查和解释生成的字节码,like this onethis one (除此之外——谷歌搜索会产生一些有趣的结果)。在我看来,Java 编译器似乎试图尽可能少地发出(当然,除了您放入 trycatch 子句中的实际代码和一些不可避免的程序流指令跳转所述子句或弹出异常对象,如果有的话)。它让 VM 负责找出异常可能被捕获的位置。这很可能会将更多负担转移到实际发生异常的场景,但正如我们所知,异常是针对异常情况的,而不是控制流。

我承认我不知道 C++ 异常通常是如何实现的,但考虑到 C++ 程序通常不在 VM 的帮助下运行,它们与 Java 的异常完全不同是非常合理的。

关于java - 有一个 try-catch block ,你应该把所有的语句都放在里面还是只放不安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17222008/

相关文章:

java - 为什么 MVC 和单例都是 'design pattern' ?

Java:给定一个文件名列表,确保相应的 XML 仅包含有关这些文件的信息

Java Date 问题,找到 X 天前的日期

c# - 哪些类型的异常不要捕获?

powershell - 如何使用变量存储catch block 的错误类型?

java.lang.NoClassDefFoundError : rcaller/RCaller in java-ee

java - 组合模型或实体?

python - 在类的每个方法中捕获相同的异常

java抛出异常而不捕获它?

asp.net - 参数计数与参数值计数不匹配