【问题标题】:PHP: try/catch failPHP:尝试/捕获失败
【发布时间】: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 .. 你们太聪明了:)

标签: php mysql exception laravel-3


【解决方案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
猜你喜欢
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 2017-02-03
  • 2011-03-21
  • 2015-10-14
  • 2014-05-11
相关资源
最近更新 更多