何时使用Try Catch块

好的,这可能是一个很小的问题,但是我发现PHP文档和几个Internetsearch没有给我任何想法。

什么时候应该使用try-catch块来改进我的应用程序?

我读过一个人说,我们应该使用try-catch块来防止致命的错误。 我读别人说,我们应该只用于意外的错误(等待什么意外?如果他们是意想不到的错误,我怎么能阻止他们尝试赶上?我应该把我所有的应用程序代码在一个尝试块?)。 其他人只是说,try-catch块应该到处使用,因为它们也可以扩展(扩展Exception类)。 最后有人说PHP try-catch块是完全没用的,因为它们实现的很糟糕。 (在这个我发现一个很好的关于性能的SO问题)。

在我看来,这个话题是非常奇怪和困惑的。 有人能照亮我吗?

在我看来,这个话题是非常奇怪和困惑的。 有人能照亮我吗?

当然。 我不是PHP用户,但是在ActionScript,Java和JavaScript中使用try / catch之后,我可能会有一点点洞察力。 请记住,不同的语言和平台鼓励try / catch的不同用途。 那说…

我build议使用try / catch的唯一时间是如果你使用的是本地语言函数

  1. 可以抛出一个错误/exception
  2. 不给你任何工具来检测你是否要做一些愚蠢的事情,会导致错误/exception。 例如:在ActionScript中,closures一个未打开的加载器会导致错误,但是加载器没有isOpen属性来检查,所以你不得不将它封装在try / catch中,以消除一个完全没有意义的错误。
  3. 错误/exception确实是没有意义的。

让我们拿你列举的例子,看看他们如何与列表。

我读过一个人说,我们应该使用try-catch块来防止致命的错误。

在AS的loader.close()函数中,这是个好build议。 这是一个致命的错误,而这一切都来自一个微不足道的失误。 另一方面,AS中几乎所有的错误都会让你的应用程序停下来。 你会把它们全部包装在try / catch中吗? 绝对不! 一个“致命错误”是致命的。 这意味着发生了非常错误的事情,并且应用程序继续处于潜在的“未定义”状态是蛮荒的。 最好知道一个错误发生,然后修复它,而不是放弃它。

我读别人说,我们应该只用于意想不到的错误

这更糟糕。 那些是你不想沉默的错误,因为消除它们意味着你永远不会find它们。 也许你没有吞咽它们,但是…也许你正在logging它们。 但是,为什么你会尝试/捕获/logging/继续,好像什么也没有发生,让程序运行在一个潜在的危险和意外的情况? 只要让错误把你踢进牙齿,然后修复它。 在尝试debugging别人编写的程序时出现错误,因为它们将所有内容都包含在try / catch块中,然后忽略logging。

其他人只是说,try-catch块应该到处使用,因为它们也可以扩展(扩展Exception类)。

如果你是一个正在抛出的人,那么这样做有潜在的优点,而且你正试图提醒自己在程序中出现一个特殊的情况……但是为什么要尝试/发现自己抛出的错误呢? 让它踢你的牙齿,然后修复它,这样你就不需要再犯这个错误了。

最后有人说PHP try-catch块是完全没用的,因为它们实现的很糟糕。 (在这我find一个很好的问题关于性能)。

也许是这样。 我不能回答这个问题。

所以……这可能是一个宗教问题,我敢肯定人们会不同意我的看法,但是从我的特殊angular度来看,这些是我多年来学习关于尝试/捕捉的经验教训。

不同的人会告诉你不同的事情。 但是,这是我的想法,特别是在Web应用程序的情况下。

您的整个页面应该在try / catch中,向用户显示错误消息。 错误信息不应该告诉用户详细情况,因为这是一个安全问题。 它应该将有关错误的信息logging到日志文件中。

另一种情况是在正常的事务中可能出现问题。 PHP不是很特别的开心,所以这可能不会发生太多。 基本上,如果遇到失败时抛出exception的函数,那么可以捕获exception并在这种情况下执行其他操作。

总的来说,你的问题就像问你怎么用锤子来提高房子的质量。 使用例外来帮助您实现特定的行为。 不要找地方使用例外。

我认为这只是一个偏好问题,但从我的经验来看,我鼓励你尽可能地使用它们。

在应用程序中,我们目前正在开发(如果重要的话,使用Zend Framework),我们使用一个try..catch块来捕获整个应用程序中显示给用户的所有exception,例如错误500s,信息到数据库。 我个人喜欢这种方法在PHP应用程序的情况下,因为例外是可扩展的,你基本上可以写任何你需要的function。

我主要使用Try / Catch围绕数据库调用…尤其是input,更新和删除等。

我有时使用它在数组和循环中使用dynamic数据和数组进行复杂的数据处理,在这种情况下可能会出现错误,例如缺less数组元素或其他东西(我通常会检查这些东西)。

我还将它们用在我没有完全控制权的操作上,例如从可能存在数据问题或访问源文件的外部或外部数据源导入数据。

我认为,“意外错误”的意思就是不能通过良好的编程实践来防止问题,比如在“包含”之前检查文件是否存在,有些问题可以预见,所以使用良好的做法来防止它们。 不要只是试图抓住他们,把他们放在一边。

使用好的编程实践,而不是像你应该做的一样。 不要把try / catch作为一切的懒惰快捷方式,无处不在。 这是主要的矫枉过正。

你无法在任何地方尝试catch块。

但是,在应用程序testing期间,生成的exception应该提醒您需要尝试捕获的地方。 这就是为什么您应该对应用程序/代码进行彻底testing的原因之一。

如果你看到一个你认为需要的地方,我会放一个。

编辑:好的,你可以把它们放在任何地方,但是你需要一些感觉,把它们放在你的代码中。

我通常会在代码中尝试和捕捉有外部力量作用于我无法控制的区域。 例如,打开和读取外部文件..你没有任何控制,在文件读取的某个时候,文件被破坏或发生其他事情,你不能控制像文件服务器DC的东西

我同意@scriptocalypse。 实际上,我只在2种情况下使用PHP中的try / catch块。

  1. 如果有可能发生一些外部的问题(而不是在我的代码中)或DB错误:

    • 从其他来源获取数据(例如, curl
    • 从文件获取数据
    • DB-例外
  2. 如果我工作在另一个系统,如CMS或类似的,我想重写某些行为。 例如,我不希望引发exception,但exception消息被返回到视图。