簡體   English   中英

即使在PHP中使用Try / Catch塊也出錯

[英]Error even when using a Try/Catch block in PHP

我有一個帶有以下代碼的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

現在我很困惑。主要思想是有時失敗,然后繼續努力。 為什么它仍然引發錯誤?

只是一個猜測,請嘗試嘗試

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 \\Exception沒有第二個catch ,PHP抱怨未捕獲的異常。 您需要明確地將該異常稱為全局

catch(\Exception $e) {

或將其導入當前名稱空間

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

FWIW,我一直都在這樣做。 舊習慣很難打破。

異常表明您正在訪問非對象的屬性。 這意味着$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));
    }
}

摘自該SO帖子該SO帖子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM