9

给我一些关于哪个是更好的编码实践/使代码更高效/看起来更漂亮/无论如何的想法:增加和提高使用 if 语句来预测和捕捉潜在问题的能力?或者只是简单地利用 try/catch?

假设这是针对 Java 的(如果重要的话)。

编辑: 我目前正在摆脱一些公认的过时和受限制的当前编码实践,但我对这样做的必要性有点担心(例如this)。我只是在询问对此的一些看法。不是辩论。

4

9 回答 9

7

这场辩论(2003 年)很好:

http://www.joelonsoftware.com/items/2003/10/13.html

http://nedbatchelder.com/blog/200310/joel_on_exceptions.html

于 2008-11-30T16:12:32.993 回答
5

if块稍微快一些;如果您不需要十几个,那么它们是一个比try/catches. 异常应该是异常的,而不是每次代码运行时。我将异常用于服务器断开等罕见事件(即使它们每天发生几次),并if阻止我的任何可控变量。

于 2008-11-30T16:03:41.917 回答
3

无论您正在编写什么代码,您最终都会同时使用这两种代码。我不能说 Java 运行时,但在 .NET 运行时,使用 try-catch 块会降低性能。因此,我尝试仅在我有明确方法处理一旦捕获的异常的区域中使用它们(即使它只是记录问题的存在)。

如果您发现自己在代码中使用了大量的 try-catch 块或 if-else 块,或者您的方法往往相当长,请考虑将代码重构为大量较小的方法。您的逻辑意图将更容易遵循 - 以及更容易进行单元测试。

于 2008-11-30T16:17:53.497 回答
2

我认为如果陈述更好。你不能用 try..catch 包围每一行代码(你可以,但你不应该这样做)。你可以用 try catch 包围一段代码,但不是每一行。

例外会减慢速度。

于 2008-11-30T16:17:16.790 回答
1

我的 2p:最好使用 try/catch:

  • 它使其他编码人员绝对清楚您正在执行异常处理
  • 编译器了解您在做什么,并且可以为您执行更合适的编译时检查

根据我的经验,使用 if-conditional-logic 会使错误处理与业务逻辑区分开来变得更加困难。

于 2008-11-30T15:59:31.223 回答
1

更有经验的开发人员和分析师告诉我,try/catch 更加面向对象,if 更加程序化。

我个人不在乎。

我知道 try/catch 较慢并导致性能下降的事实,但如果我要使用十几个 if 来验证,然后才能做我想做的事,我将始终使用 try/ catch 以节省代码行数。

它使我的生活变得更加轻松,无需验证任何内容,如果语句失败,只需执行我在“else”块中所做的事情......在我的“catch”块中。

有时,我显然将一些 if 语句包含在 try/catch 中,但无论如何。

如果在做我需要做的事情之前只有少量的事情需要验证(1 或 2),我会使用 if。

于 2009-11-21T13:55:58.370 回答
0

有一件事在这里没有提到。

使用 if-else 语句,每次代码运行时,保证至少有 1 个条件被执行。我相信我们都知道 if-else-elseif 是如何工作的,但要清楚......语句的if部分将始终被评估,如果它是 false 则下面的else-if被评估,依此类推,直到只有else需要评估。

所以使用 if-else 语句会影响你的表现。不显着(在大多数情况下),但执行评估确实需要 CPU 时间。

try-catch 语句,如果我错了,请纠正我,在需要它们之前不要在运行时考虑(即抛出异常)。因此,简单地将代码包装在 try-catch 中不会影响性能,直到它实际捕获到异常为止。

此外,导致性能下降的不是接球,而是投掷。

重要的一点是,try-catch 语句永远不应该用于条件逻辑。它们应该只用于它们的设计目的:异常处理!

如果您知道如何处理异常,则捕获异常是必不可少的。如果您无法正确处理异常,那么您应该放手,因为链上的某些代码可能有更好的方法来处理它。

在应用程序的绝对顶级有一个异常处理程序以在用户看到异常之前捕获它们通常是一个好主意。在 ASP.NET 中,您可以在 global.asax 的 Application_Error 事件中执行此操作。在其他语言/环境中,您可以在主循环中执行此操作,无论它可能是什么。

但请注意,有一些例外总是最好不要被抓住。有时,当异常发生时,它表明您的应用程序的状态已受到严重破坏并且无法信任。唯一安全的做法是杀死并重新启动。

于 2009-11-26T16:14:47.473 回答
0

@PersonalPerson - 对不起,但这只是懒惰的编码。与其因为 if 语句太多而使用 try-catch,不如重构您的代码(即将您的验证逻辑放在它自己的方法中)。这将使您的代码更清晰、更具可读性,并保持最佳性能实践。

永远不要尝试编写代码来实现最少的行数。这总会以糟糕的结局告终。当然,您可以找到一种更优雅的方式来编写您的编码伙伴会赞不绝口的东西,但这只会使事情变得不那么可读。

我发誓,我以前用过你的代码,这让我很头疼。

于 2009-11-26T16:40:38.187 回答
0

使用异常是一种通用方法,可以通知代码的其他部分以松散耦合的方式发生了错误。想象一下,如果您想通过使用 if.. nad else.. 来处理一些异常情况,您需要在代码的不同部分插入一些任意变量和其他可能很容易导致很快出现意大利面条代码的东西。

接下来假设您正在使用任何外部库/包,并且作者决定在他/她的代码中放入其他任意方式来处理错误状态 - 它会迫使您调整处理它的方式 - 例如您需要检查特定方法是否返回 true 或 false 或其他。

使用异常可以更容易地处理错误——你只是假设如果出现问题——其他代码会抛出异常,所以你只需将代码包装在 try 块中并以自己的方式处理可能的异常。

于 2017-11-14T00:01:58.030 回答