彻底使用'if'语句或'try / catch'块?

时间:2008-11-30 15:53:35

标签: comparison if-statement try-catch

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

让我们说这是针对Java的(如果重要的话)。

编辑:我正在将自己从一些公认的过时和受限制的当前编码实践中转移出来,但我对于在几个方面这样做的必要性有点不知所措(例如就像这个)。我只想问一些关于此的观点。不是辩论。

9 个答案:

答案 0 :(得分:7)

答案 1 :(得分:5)

if块稍快一点;如果你不需要十几个,那么它们比try/catches更好。例外应该是例外,而不是每次代码运行。我使用异常来处理服务器断开连接等罕见事件(即使它们每天都发生几次),并且if阻止我的任何可控变量。

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

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

异常减慢了事情。

答案 4 :(得分:1)

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

  • 它使其他编码员明确表示您正在进行异常处理
  • 编译器了解您正在做什么,并可以为您执行更合适的编译时检查

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

答案 5 :(得分:1)

从经验丰富的开发人员和分析师的说法来看,try / catch更面向对象,如果更具程序性。

我个人并不在乎。

我知道try / catch更慢并且会导致性能下降这一事实,但是如果我要在我能做我想做的事情之前使用十几个ifs进行验证,我会一直使用一个try / catch来节省代码行数。

这让我的生活变得更加容易,无需验证任何内容,如果陈述失败,只需按照我的'其他'块'做我想做的事情......在我的'catch'块中。

有时,我显然在try / catch中附上了一些if语句,但无论如何。

在执行我需要做的事情之前,我只使用了一小部分来验证(1或2)。

答案 6 :(得分:0)

这里有一件事没有提到。

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

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

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

此外,它不是导致性能下降的捕获,而是抛出。

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

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

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

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

答案 7 :(得分:0)

@PersonalPerson - 抱歉,这只是懒惰的编码。而不是使用try-catch,因为if语句太多,为什么不重构代码(即将验证逻辑放在自己的方法中)。这将使您的代码更清晰,更易读,并保持最佳的性能实践。

永远不要尝试编写代码来实现最少的行数。这总是很糟糕。当然,你可以找到一种更优雅的方式来编写你的编码器伙伴们会噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢

我发誓,我之前使用过您的代码,这让我头疼。

答案 8 :(得分:0)

使用异常是一种通用方法,用于以松散耦合的方式通知代码的其他部分发生了错误。让我们想象一下,如果你想通过使用if ... nad else来处理一些异常条件,你需要在代码的不同部分插入一些任意变量和其他很可能很快就会产生意大利面条代码的东西。 / p>

接下来想象一下,你正在使用任何外部库/包,并且它的作者决定以其他任意方式处理他/她的代码以处理错误的状态 - 它会迫使你调整它的处理方式它 - 例如,你需要检查特定方法是返回true还是false或者其他什么。

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