【问题标题】:Java proper use of exceptions and costJava正确使用异常和成本
【发布时间】:2014-01-27 02:26:16
【问题描述】:

我正在尝试采用稍微更严格 的方法来编写这个类。与我通常的牛仔编码风格不同,我想先列出方法、变量、cmets ......所有这些爵士乐。

所以现在这里是异常的概念。

我是否应该思考“这个函数中可能出现的所有问题?”并为每个抛出一个异常(如果现有的描述性不够,那么创建一个新的)?这似乎是最精确的选择。

如果思路是“这些事情可能会出错,我会为其他所有事情抛出一个一般性例外。”

“什么都不会出错,我不需要抛出异常,更糟糕的情况是我可以抛出运行时异常,以防万一出错......”

我在这里担心的是错误处理的性能。理想情况下,我可以想象 Java 只是将这些异常转换为漂亮的小 if 语句或某种跳转语句。我想这可能只需要一次手术左右。

我还可以想象 Java 为了抽象而创建了一个 20 次深度调用的马戏团,也许它们的成本很高,我应该假装我重新用 C 编码?

我以一种愚蠢的方式写了这个问题,因为这样对我们双方都更有趣,但这是一个严肃的问题。我敢肯定有一些平衡,也许是经验法则或十法则。您如何看待异常?

编辑: 我并不是建议我使用异常进行处理。我说的是异常的数量和精确度(错误的具体程度如何?)。

【问题讨论】:

  • 例外是昂贵的,期间。例外也是例外,因此成本可能无关紧要。
  • 例外适用于特殊情况。您不应该太在意它们在运行时花费的几纳秒。相反,您应该关心使代码清晰、可维护和易于使用。
  • 是否有证据表明异常只“花费”几纳秒?性能是一个有效的设计问题。
  • 我不会担心性能下降,除非您测量到存在问题。我建议您转而担心使代码尽可能清晰和健壮,然后再进行测量。 BTW 异常只有在触发时才会产生成本,而很少触发的简单检查可以通过 CPU 中的分支预测进行优化。
  • 我不理解这个社区/行业对忽视绩效的痴迷。当您不为性能而设计时,它就不会执行。也许这对米老鼠应用程序来说很好,但如果你知道你必须扩展,你为什么不计划呢?

标签: java exception exception-handling error-handling runtime-error


【解决方案1】:

异常在运行时成本更高,因此不应用作“正常”处理的一部分。

例外是针对特殊情况。预期的失败不应产生异常。例如,提供无效输入(密码错误、邮政编码无效等)的用户不应产生异常。

例外是错误和严重的不可恢复的系统故障。

请注意,JDBC 对异常的使用设计得很糟糕(根据我建议的原则)。

【讨论】:

  • 在一个愚蠢的微基准测试中,我刚刚在 100 毫秒内抛出并捕获了 100,000 个异常。典型的 SQL 查询执行成本是多少? SQLException(异常)相对于 SQL 请求执行本身的相对成本是多少? SQLException 的问题在于它们是经过检查的异常,而不是它们是异常。
猜你喜欢
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 2013-12-12
相关资源
最近更新 更多