即使在PHP中使用Try / Catch块也会出错

时间:2015-05-12 17:15:04

标签: php laravel

我有一个带有以下代码的Laravel / PHP应用程序:

try {
        //gets the day of the last record for logged in user
        $lastRecord = $user->records()->orderBy('date', 'DESC')->first()->date;
        //convert to date
        $lastTime = \Carbon\Carbon::createFromFormat('Y-m-d', $lastRecord);
    }
    catch(Exception $e) {
        $lastTime = \Carbon\Carbon::now($user->timezone)->addDays(-1);
    }

但我仍然收到错误:

ErrorException in Habit.php line 104:
Trying to get property of non-object

现在我感到很困惑。主要想法是有时会失败,然后继续捕捉。它怎么还会引发错误?

2 个答案:

答案 0 :(得分:8)

只是一个猜测,但试试这个

try {
    //gets the day of the last record for logged in user
    $lastRecord = $user->records()->orderBy('date', 'DESC')->first()->date;
    //convert to date
    $lastTime = \Carbon\Carbon::createFromFormat('Y-m-d', $lastRecord);
}
catch(\Exception $e) {
    $lastTime = \Carbon\Carbon::now($user->timezone)->addDays(-1);
}

即,在Exception前面添加一个前导名称空间分隔符。我的猜测是你在命名空间文件中使用这段代码。当你做这样的事情时

namespace App\Some\Somenamespace;
...
catch(Exception $e) {
...

PHP假设您要捕获名为App\Some\Somenamespace\Exception的异常。由于这不是抛出的异常,并且全局PHP catch没有第二个\Exception,因此PHP会抱怨未捕获的异常。您需要将异常明确引用为全局

catch(\Exception $e) {

或将其导入当前名称空间

namespace App\Some\Somenamespace\;
use Exception;
...
catch(Exception $e) {
...

FWIW,我仍然一直这样做。旧习惯很难打破。

答案 1 :(得分:0)

异常表示您正在访问非对象的属性。这意味着$user本身或链中的某个属性不存在。可以通过检查返回值来避免这种情况。

但是如果你仍然想要捕获致命错误,你可以安装一个全局关闭处理程序,如下所示:

register_shutdown_function( "shutdown_handler" );

function fatal_handler() {
    $errfile = "unknown file";
    $errstr  = "shutdown";
    $errno   = E_CORE_ERROR;
    $errline = 0;

    $error = error_get_last();

    if( $error !== NULL) {
        $errno   = $error["type"];
        $errfile = $error["file"];
        $errline = $error["line"];
        $errstr  = $error["message"];

        error_mail(format_error( $errno, $errstr, $errfile, $errline));
    }
}

取自this SO postthis SO post

相关问题