我有一个带有以下代码的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
现在我感到很困惑。主要想法是有时会失败,然后继续捕捉。它怎么还会引发错误?
答案 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));
}
}