不同风格的程序流程?

17 c++ java

我是一名计算机科学专业的学生,​​所以我不知道那么多.

我最近和一位刚接受(java)软件开发人员工作的朋友谈话.他告诉我,在他的工作中,有一个人在C++方面很有经验,但不幸的是,每当他用java编写代码时,他都会使用try-catch来控制程序的流程.据我的朋友说,这是一种错误的Java风格.这是真的?在C++和Java之间使用try-catch(最终在java中)有什么不同(如果有的话)?

Joh*_*don 28

使用try-catch控制程序的流程在任何地方都是错误的...异常处理就是它所说的:处理异常情况.

当然,对于每个规则,都有十几个必要偏差的反例,但一般来说:不要用例外来控制程序流程.

当您预期在正常操作环境中抛出某些异常时,会使用异常来控制程序流,并根据这些异常做出逻辑决策.

例如,以伪代码控制程序流程:

try {
  write update to file
} catch (IOException) {
  write update to alternate file
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,在盲目执行写入之前实际测试路径存在会更好.

我删除了权限检查说明,因为这是一个不好的例子

异常处理的一个很好的用法:(再次伪代码)

try {
  do stuff
} catch(OutOfMemoryException) {
  fail gracefully (don't try and do something else to achieve the same result)
}
Run Code Online (Sandbox Code Playgroud)

  • @Muggen如果你有一个打开的文件,你应该能够阅读,但如果你不能这是一个例外情况.如果用户尝试登录但输入的密码无效,则这是正常的流量条件,应该这样处理,而不是使用try-catch (3认同)
  • 这是一个非常好的问题@Muggen; 我会试着更新我的答案,但我认为值得一提的是它自己的问题. (2认同)
  • @Muggen; 另一种说法是:如果你能想到在正常使用流程中可能出现的情况,你可能不希望使用异常来处理它.(关于一般答案的所有注意事项) (2认同)
  • 这是一个很好的答案,但我想对"权限检查"示例发表评论 - 尝试在执行操作之前自己检查权限通常不是*一个好的设计选择.通常,您应该尝试操作并处理故障.这是因为检查权限可能非常复杂,并且很难匹配系统可能执行的检查.更简单的示例可能是在使用它之前检查空引用,而不是捕获NullPointerException或确定数组的大小而不是捕获IndexOutOfBoundsException. (2认同)

Jam*_*unt 8

我想说从程序架构的角度来看,Java和C++中异常的目的是相同的.它们应该用于处理特殊情况,而不是直接正常的程序流程.

反对使用例外的最常见的论点是它们很慢.像大多数基于代码速度的参数一样,现在几乎总是无关紧要,特别是在正确使用异常的情况下.

  • 在这种情况下,"它们很慢"是一种代理论证,因为"这不是它们的用途".有些人不喜欢这样的高级符号推理,所以你必须给他们一些例子.当你使用超出其预期用途范围的东西时,你就会遇到问题(这种用法的速度很慢).如果有人碰巧解决了这个问题,那么这个世界仍然是不对的. (3认同)
  • 每当它用于控制程序的流程,而不是处理异常情况.例如,如果您可以检查数组的长度,请不要使用索引超出范围的异常来知道您传递索引的数组长度,而只是让for循环终止于适当的点. (2认同)

T.E*_*.D. 6

我认为他所说的是他正在使用例外的非常规条件,如正常的循环终止.对于大多数提供异常(包括C++)的语言的程序员来说,这被认为是禁忌.

这样做的原因是异常往往会拖累相当多的信息.在某些平台上,它们将整个callstack带到异常点,以便在一个很好的调试消息中显示它.这是非常昂贵的,如果你真正想要的是无条件控制跳跃.

相反,你应该使用像break,return甚至甚至(在真正的捏)中的陈述goto.

  • 另一方面,这是Python中的"是 - 是",其中**每个for循环**都是通过处理StopIteration异常来终止的.;) (2认同)
  • @UncleBens - 非常感谢你验证我的愚蠢行为.我认为必须至少有一个.:-) (2认同)