【发布时间】:2015-05-17 23:24:22
【问题描述】:
我只是 reading about try-catch blocks 和异常处理,我在“传播 IOExceptions”部分读到一些让我有点困惑的东西。 Jenkov 说,如果方法 C 抛出 IOException - public void MethC() throws IOException{}- 但没有 try-catch 来处理它,它会将调用堆栈汇总到可能有 try-catch 来处理异常的调用方法
try-catch-finally 块的全部意义似乎是处理一个异常,该异常会在未处理的情况下使您的程序崩溃,对吗?那么,为什么让异常将调用堆栈回滚到链上某处的try-catch?价值是什么?如果有的话,在我看来,让异常向上滚动而不是立即处理它只会损害程序并且是错误的形式并导致效率低下或效率低下。
【问题讨论】:
-
如果
MethC没有正确处理异常的选项,那么它应该传播到它的调用方法,以便它可以处理它。例如,通过记录异常或使用 UI 向用户显示通知。这最终得到了更好的代码MethCs 唯一的责任是使用 I/O 操作做某事,它不应该关心打开日志文件或启动与用户的对话。 “妥协程序” 为什么以及如何? “坏形式” 怎么样? “导致效率低下或效率低下” 如何?你能详细说明你的陈述吗? -
@Tom 我在课堂上处理异常方面做得并不多,我正在尝试自学一些可能对我正在从事的项目有用的东西。当我阅读有关传播异常的信息时,在我看来,处理异常的最佳位置(例如
IOException)就是它发生的地方。关于 "compromise" 部分,在我看来,让异常向上移动是没有意义的,并且可能对程序的运行或其他东西造成危险。同样,这是我试图自学,所以我的担忧可能是没有根据的。 -
“再说一次,这是我试图自学,所以我的担忧可能是没有根据的。” 但是您应该考虑编辑您的问题以解释您为什么这么认为(妥协,低效,糟糕的形式),因此其他人可以解释为什么这是对或错的。
-
有些人确实同意你的观点。例如“去”语言的人。而且很多人不喜欢检查异常(java 是唯一拥有它的语言)。 Java 是一种非常古老的语言。新语言从 Java 提供的真实用户体验中吸取了很多教训(好的或坏的)。尽管他们随后嘲笑 java 并不酷 :(