我已经花了很长时间编写PHP,但不是PHP 5 ...我已经知道PHP 5中的异常处理已有一段时间了,但从未真正研究过它。在使用快速Google之后,使用异常处理似乎毫无意义 - 我无法看到使用它而不仅仅使用一些if(){}语句,以及我自己的错误处理类或其他任何东西的优点。
使用它必须有很多充分的理由(我猜?!)否则它不会被放入语言(可能)。有人能告诉我它只使用一堆if语句或switch语句或其他什么好处吗?
答案 0 :(得分:6)
例外允许您区分不同类型的错误,并且也非常适合路由。例如......
class Application
{
public function run()
{
try {
// Start her up!!
} catch (Exception $e) {
// If Ajax request, send back status and message
if ($this->getRequest()->isAjax()) {
return Application_Json::encode(array(
'status' => 'error',
'msg' => $e->getMessage());
}
// ...otherwise, just throw error
throw $e;
}
}
}
然后可以通过自定义错误处理程序处理抛出的异常。
由于PHP是一种松散类型的语言,您可能需要确保只将字符串作为参数传递给类方法。例如......
class StringsOnly
{
public function onlyPassStringToThisMethod($string)
{
if (!is_string($string)) {
throw new InvalidArgumentException('$string is definitely not a string');
}
// Cool string manipulation...
return $this;
}
}
...或者如果您需要以不同的方式处理不同类型的异常。
class DifferentExceptionsForDifferentFolks
{
public function catchMeIfYouCan()
{
try {
$this->flyForFree();
} catch (CantFlyForFreeException $e) {
$this->alertAuthorities();
return 'Sorry, you can\'t fly for free dude. It just don\'t work that way!';
} catch (DbException $e) {
// Get DB debug info
$this->logDbDebugInfo();
return 'Could not access database. What did you mess up this time?';
} catch (Exception $e) {
$this->logMiscException($e);
return 'I catch all exceptions for which you did not account!';
}
}
}
如果在Zend Framework中使用事务:
class CreditCardController extends Zend_Controller_Action
{
public function buyforgirlfriendAction()
{
try {
$this->getDb()->beginTransaction();
$this->insertGift($giftName, $giftPrice, $giftWowFactor);
$this->getDb()->commit();
} catch (Exception $e) {
// Error encountered, rollback changes
$this->getDb()->rollBack();
// Re-throw exception, allow ErrorController forward
throw $e;
}
}
}
答案 1 :(得分:3)
Exception handling: If condition versus Exception并非特定于PHP,但提供了良好的视角。就个人而言,例外情况和try / catch以语言实现,以强制开发人员之间的良好行为,通常不会像错误检查/处理那样关注。
如果你确信你的if / else if / else正在捕捉所有场景,那就不好了。
以下是Advantages of Exceptions - Java的概述 - 有一段时间,有一段代码包含许多if / else语句和以下摘录:
这里有很多错误检测,报告和返回,原始的七行代码在混乱中丢失了。更糟糕的是,代码的逻辑流程也已丢失,因此很难判断代码是否正在做正确的事情:如果函数无法分配足够的内存,文件是否真的被关闭了?在编写方法三个月后修改方法时,确保代码继续做正确的事情变得更加困难。许多程序员通过忽略它来解决这个问题 - 当程序崩溃时会报告错误。
所以真的,最终归结为个人偏好。如果您希望代码可读并且可供其他人使用,那么通常是更好的方法并实施最佳行为
答案 2 :(得分:2)
如果您遵循面向对象的方法,那么异常便可用于错误处理。通过对象之间的异常来传递错误很方便。 如果采用分层设计方法,例外非常有用。
如果您不是以面向对象的方式编码,则不需要例外。
答案 3 :(得分:2)
如果我们不确定代码结果,我们会使用异常处理。我们将这段代码放在try块中,并在catch块中捕获该错误。请check this link了解更多信息。
答案 4 :(得分:1)
一般来说,使用异常处理有两个很好的理由:
您现在可能始终知道异常将在何处发生 - 可能会出现意外情况。如果您使用全局异常处理程序,则可以确保无论出现什么问题,您的程序都有机会恢复。类似地,一段特别敏感的代码(比如执行I / O的代码)可能会有各种不同的错误,这些错误只能在运行时检测到,并且您希望捕获任何可能的意外情况。在测试期间可能不会发生某些事情;就像你控制之外的服务器失败一样?这可能永远不会在它真正发生之前进行测试(尽管良好的测试会包括这个)。这是更重要的原因。
性能。通常会实现异常,以便只要没有出错就一切都很快。异常在发生后被捕获。这意味着如果出现问题,不必事先评估'if'语句,并且在这种情况下开销非常低。如果不使用异常,则会强制在代码中添加大量“if”语句。虽然通常这不是一个问题,但这可能会破坏性能关键的应用程序。这尤其正确,因为CPU中的分支误预测可能导致流水线冲洗。
答案 5 :(得分:0)
我的理由是在trigger_error()之后调用异常;函数,您还可以向该异常发送一些额外的信息=更好的调试?
我不确定,但我认为就是这样
<击>例如:击>
<击> class db
{
功能连接()
{
mysql_Connect(“lolcalhost”,“root”,“pass :)”)或trigger_error(“Test”);
}
}
尝试
{
}
赶上(db
击>
答案 6 :(得分:0)
拥有异常框架的一个主要原因是,如果代码到达无法继续的程度,它就能够告诉周围的上下文出现问题。这意味着如果我有一个类Foo
需要在$fooInstance->setBarHandler($barHandler)
成功之前调用$fooInstance->doFoo();
,那么该类可以向更大的上下文提供消息,而不是静默失败并返回{{ 1}}。此外,它允许上下文说,“嗯。那破了。好吧,我现在可以告诉用户/日志/其他东西发生了一些不好的事情,我可以决定是否需要继续进行。”
答案 7 :(得分:0)
-1
或false
更多的数据。try .. catch
块可以嵌套,catch
块中可能有多个try .. catch
块。异常强制您处理错误。如果您不使用它们,请执行以下操作:
function doSomething($a, $b, $c) {
...
if ($a < $b && $b > $c) {
return -1; // error
}
...
}
$d = doSomething($x, $y, $z);
if ($d === -1) {
die('Fatal error!');
}
只要你记得检查函数是否返回错误,一切都很好。但是,如果你忘了检查那会发生什么?这实际上是一个非常普遍的问题。
例外使程序的流程更加自然。
答案 8 :(得分:0)
在正确的上下文中很难使用异常,尤其是在php中。我个人在发生这三件事时会使用异常:
资源失败异常 - 您可以在程序内存不足时抛出异常。例如,在运行超过30秒执行的脚本时在php中。虽然你可以在.ini
中提出这个问题客户端代码错误异常 - 例如,尝试使用错误的凭据连接到数据库或取消链接不在服务器上的文件时。或者当数据库服务器关闭且无响应时,您可以抛出异常。
程序员错误异常 - 这些是由于您自己的编码问题而产生的错误。当您不确定代码会给您的结果时,也可以使用此错误。例如,除以0。