2009-10-13 133 views
2

我有下面的PHP代码:为什么我会收到“未捕获的异常”错误?

foreach (...) { 
    try { 
    $Object = MyDataMapper::getById(123); 

    if (!$Object->propertyIsTrue()) { 
     continue; 
    } 
    } 
    catch (Exception $e) { 
    continue; 
    } 
} 

MyDataMapper :: getById()将抛出一个异常,如果没有找到一个数据库记录。下面是该方法的定义:

public static function getById($id) { 
    $query = "SELECT * FROM table WHERE id = $id"; 

    $Connection = Database::getInstance(); 
    $Statement = $Connection->prepare($query); 
    $Statement->execute(); 

    if ($Statement->rowCount() == 0) { 
    throw new Exception("Record does not exist!"); 
    return null; 
    } 

    $row = $Statement->fetch(); 

    return self::create($row); 
} 

当该代码被称为为不存在的数据库记录ID,我得到一个致命的未捕获的异常“异常”的错误。

这是为什么?很显然,我正在捕捉异常......我做错了什么?

我确定引发异常。我是如何处理异常的 - 可能是继续吗?

编辑

感谢来自抖动帮助,以下解决方法解决了这个问题:

if (!$Object->propertyIsTrue()) { 
// Workaround to eAccelerator bug 291 (http://eaccelerator.net/ticket/291). 
$foo = 555; 
continue; 
} 
+0

请更改标题以更真实地反映实际问题。 – Buggieboy 2009-10-13 19:10:44

回答

2

什么是PHP版本? - >5.2.9

您使用的是eAccelerator(哪个版本)? - >0.9.5.3 with ionCube PHP Loader v3.1.34

你抛出了什么样的异常? - >正常的异常在某些PHP + eAccelerator在版本


存在已知问题关于的try-catch块被优化掉。

检查eAccelerator在错误跟踪器:

对于首发查票

291 Incorrect handling of exception

314 Exceptions not catched

317 Exception not caught

,并尝试禁用eAccelerator在。

+0

v5.2.9。是的:使用ionCube PHP Loader v3.1.34 v0.9.5.3。只是一个例外的例子。它发生在映射器方法中,该方法在foreach循环中调用,因此当使用不存在的记录的ID调用MyDataMapper :: getById()时,它发生在foreach循环内部。 – 2009-10-13 18:27:33

+0

扩展解答 – jitter 2009-10-13 18:32:11

+0

非常感谢您的帮助。 eAccelerator问题291是问题所在。使用建议的解决方法解决了问题(显然!)。我已经使用解决方法更新了我的帖子。 – 2009-10-13 19:00:28

0

我想这可能是因为你调用一个静态方法,但我可能是错的。是否有可能通过实例化MyDataMapper并从对象本身调用该方法来测试它?

+0

那么,我已经用其他静态映射器方法做了几十次 - 所以我知道这不是问题。 – 2009-10-13 18:15:29

+0

哦,在这种情况下,我会建议设置一个自定义异常处理程序(http://us2.php.net/manual/en/function.set-exception-handler.php),以便您可以查看跟踪并执行一些操作调试:) – 2009-10-13 18:27:37

+0

我实际上有一个 - 每当发生致命错误时我收到一封电子邮件。跟踪包括指向我在我的文章中列出的代码。 – 2009-10-13 18:29:27

相关问题