何时使用Try Catch块

时间:2011-03-04 20:54:56

标签: php try-catch

好的,这可能是一个非常noob的问题,但我发现PHP文档和几个Internet搜索没有给我任何想法。

  

我何时应该使用try-catch块来改善我的应用程序?

我读到有人说我们应该只使用try-catch块来防止致命错误。 我读到其他人说我们应该只在意外错误上使用它(等待什么?意外?如果它们是意外错误我怎么能用try-catch阻止它们?我应该把所有应用程序代码放在try块中吗?)。 其他人只是说try-catch块应该在任何地方使用,因为它们也可以扩展(扩展Exception类)。 最后有人说PHP try-catch块完全没用,因为它们实现得非常糟糕。 (在此我发现了一个关于性能的好问题。)

在我看来,这个话题非常奇怪和困惑。有人会点亮我吗?

7 个答案:

答案 0 :(得分:36)

  

在我看来,这个话题非常奇怪和困惑。有人会点亮我吗?

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

我建议使用try / catch的唯一时间是你使用的是

的母语功能
  1. 可以抛出错误/异常
  2. 不会给你任何工具来检测你是否要做一些会导致错误/异常的愚蠢行为。例如:在ActionScript中,关闭未打开的加载器将导致错误,但加载器没有要检查的isOpen属性,因此您不得不将其包装在try / catch中以使一个完全无意义的错误无效。< / LI>
  3. 错误/异常确实无意义。
  4. 让我们看一下你列出的例子,看看它们与该列表的对比。

      

    我读到有人说我们应该只使用try-catch块来防止致命错误。

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

      

    我读了别人说我们应该只在出现意外错误时使用它

    情况更糟。这些都是你不想沉默的错误,因为沉默它们意味着你永远不会找到它们。也许你不会吞下它们,但是......也许你正在记录它们。但是为什么你会尝试/捕获/记录/继续,好像什么也没发生,允许程序在潜在的危险和意外情况下运行?只是让错误踢你的牙齿,然后修复它。比试图调试别人写的程序中的错误更令人沮丧,因为它们将所有内容都包装在try / catch块中然后忽略了记录。

      

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

    如果你是那个正在投掷的人,那么你有潜在的优点,并且你试图提醒自己你的程序中的异常情况......但为什么要尝试/抓住你自己抛出的错误?让它踢你的牙齿,然后修复它,这样你就不需要再抛出错误了。

      

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

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

    所以......这可能是一个宗教问题,我肯定会有人不同意我,但从我的特殊观点来看,这些是我多年来在尝试/捕获方面所吸取的教训。

答案 1 :(得分:11)

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

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

另一种情况是在事务的正常运作中可能出现问题。 PHP并不是很高兴,所以这可能不会发生太多。基本上,如果遇到一个在失败时抛出异常的函数,你可以捕获异常并在那种情况下做其他事情。

一般来说,您的问题就是询问如何使用锤子来提高房屋的资格。使用例外来帮助您实现特定的行为。不要寻找使用例外的地方。

答案 2 :(得分:5)

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

在应用程序中,我们目前正在开发工作(如果重要的话,使用Zend Framework),我们使用一个try..catch块来捕获整个应用程序中的所有异常,这些异常向用户显示,例如,错误500和异常是记录了更多信息到数据库。我个人喜欢PHP应用程序,因为异常是可扩展的,你基本上可以编写你需要的任何功能。

答案 3 :(得分:3)

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

我有时会在使用动态数据和数组的数组和循环的复杂数据处理中使用它,因为有可能出现问题,即:缺少数组元素或其他东西(我通常会检查这样的东西)。

我还将它们用于我无法完全控制的操作,例如从外部或外部数据源导入数据,这些数据可能存在数据问题或访问源文件。

我认为“意外错误”的含义是你不能通过良好的编程实践来预防问题,例如在“包含”它之前检查文件是否存在,你可以预见的一些问题因此使用良好的做法来防止它们。不要只是把它们包裹在try / catch中,让它们有机会。

使用良好的编程实践,而不是在任何地方。不要在任何地方使用try / catch作为懒惰的快捷方式。这是一个重大的过度杀伤。

答案 4 :(得分:1)

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

  1. 如果可能发生某些外部(不在我的代码中)或发生数据库错误:

    • 从其他来源获取数据(例如curl
    • 从文件中获取数据
    • DB-例外
  2. 如果我在其他系统中工作,如CMS或类似系统,我想覆盖某种行为。例如,我不想抛出异常但是异常消息被返回到视图。

答案 5 :(得分:0)

你无法在任何地方放置try catch块。

但是,在应用程序测试期间,生成的异常应提醒您需要尝试捕获的位置。这就是您应该对您的应用程序/代码进行全面测试的一个原因。

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

编辑:好的,你可以将它们放在任何地方,但你需要知道将它们放在代码中的位置。

答案 6 :(得分:0)

我通常将Try and Catch放在代码中的区域,这些区域有外部力量作用于我无法控制的区域。例如,打开和读取外部文件..您无法控制在读取文件的某个时刻,文件已损坏或发生其他无法控制的文件服务器DC或其他内容