PHP:尝试/捕获失败

Posted

技术标签:

【中文标题】PHP:尝试/捕获失败【英文标题】:PHP: try/catch fail 【发布时间】:2014-01-24 06:29:10 【问题描述】:

我正在使用 php 5.4.16 运行 WAMSERVER 2.4(32 位),这是一个 Laravel 3 项目。

在我预计会失败的try 块中,我提交了一个重复行以针对唯一性约束进行插入。 它没有处理catch 中的异常,而是从try 块中抛出“未处理的异常” 错误并失败。

    // This throws an error if the relationship already exists.
    // If that happens, just pass it to the logger and move on.
    try 
        $entity->$pivotMethod()->attach( $rowData->get_key(), $ext );
     catch (Exception $e) 
        $err = $e->getMessage()."\n";
        error_log($err);
    

这是它抛出的错误: 未处理的异常

消息:

SQLSTATE[23000]:完整性约束违规:1062 键“唯一”的重复条目 '695d7f0b-53b8-11e3-93fc-c12677e410a5-0-0-14-'

SQL:INSERT INTO person_contact (person_uuid,phone_id) 值 (?, ?) 绑定:数组(0 => '695d7f0b-53b8-11e3-93fc-c12677e410a5', 1 => 14)

位置:C:\path\to\laravel\3_2_13\database\connection.php 263行

【问题讨论】:

如果没有抛出异常,它将永远不会到达 catch 块 +1 是的!你必须抛出异常 您上面的块是否在命名空间内的类中? 试试\Exception而不是Exception 做到了(命名空间)!谢谢@Machavity 和#DanFromGermany .. 你们太聪明了:) 【参考方案1】:

根据您的评论,这是您的问题

namespace Something;

class myClass 

    function method() 
          try 
        $entity->$pivotMethod()->attach( $rowData->get_key(), $ext );
        catch (Exception $e) 
        $err = $e->getMessage()."\n";
        error_log($err);
       
    

在这种情况下,您输入提示您正在捕获异常,但您没有指定范围,因此 PHP 假设您正在捕获 \Something\Exception

修复非常简单。添加 \ 告诉 PHP 捕获任何是或扩展基 Exception 类的内容

catch (\Exception $e)

【讨论】:

+1 我希望你不只是从 cmets 那里得到这个答案,DanFromGermany 首先发现了它 :) 我知道这个解决方案是因为几个月前我遇到了同样的问题,但他的猜测首先出现了 您的块在命名空间内的类中吗?欢迎您 不,这就是为什么我问它是否在命名空间中。我以前遇到过这种类型的问题。当你这样输入提示时,PHP 会变得非常具体。除非您知道自己将捕获特定类型的异常,否则最好使用 \Exception

以上是关于PHP:尝试/捕获失败的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 JQuery 捕获日志失败和 404

KDB:尝试捕获列表并返回失败列表

为啥 XCUITest 在 Xcode 11.4.1 中捕获的流失败

如何捕获 Ajax 查询发布错误?

405 - 未捕获(承诺中)错误:请求失败,状态码为 405

C#、While 循环、尝试捕获、记录、继续