语义方面,如果您已经决定了要将 try-catch 构造放入哪种方法(并且您对自己做出正确的决定感到满意),那么答案相当简单:
- 您应该在
try
块中包含一系列语句,这样,如果其中一个语句失败,则应该放弃该序列的其余部分。没有更多也没有更少的陈述。
如果您正确地遵循上述建议,诸如所需的程序流程和最有效的局部变量作用域之类的问题将非常容易且明显地得到解决(在大多数情况下)。您会注意到这并不排除嵌套try
块的可能性。
在性能方面,异常处理的开销在于实际抛出和捕获可抛出对象。换句话说,只有真正发生异常时才会真正产生开销。代码中仅存在 try-catch 结构不会引入任何可测量的开销(可能根本没有)。此外,语句的数量(在给定的 try-catch 结构中)与其性能完全无关。
编辑:我在 JVM 规范中找不到要链接的任何详细信息,但是用户有很多帖子检查和解释生成的字节码,比如这个和这个(以及许多其他的 - 谷歌搜索会产生一些有趣的结果)。对我来说,看起来 Java 编译器试图尽可能少地发出(当然,除了你放入的实际代码try
和catch
子句和一些不可避免的程序流指令来跳过所述子句或弹出异常对象(如果有)。它让 VM 负责找出异常在哪里被捕获。这很可能会将更多的负担转移到实际发生异常的场景中,但正如我们所知,异常是针对异常情况的,而不是控制流。
我承认我不知道 C++ 异常通常是如何实现的,但是考虑到 C++ 程序通常不会在 VM 的帮助下运行,它们与 Java 的完全不同是非常合理的。