2016-11-11 130 views
0

我試圖使用Laravel連接到LDAP服務器。說我正在使用PHP函數ldap_connectldap_bind而不是使用包來處理它是很重要的。Laravel如何處理PHP警告?

問題是,當我提供錯誤的用戶名和密碼時,ldap_bind函數給我們一個PHP警告。對於此警告,我可以,並且如文檔中所述,函數返回false未發生綁定時。

但是,當這個警告被觸發時,Laravel正在拋出異常。這不是一個例外,Laravel不應該拋出異常,我不想把這當作例外處理;我只需構建一個if條件,它將向用戶返回一條消息。

Laravel是否會將所有警告都視爲異常?

+0

如果拋出特定的異常,您可以覆蓋其處理程序的行爲與默認行爲不同。請參閱Laravel Docs中的[this](https://laravel.com/docs/5.3/errors#the-exception-handler)。什麼是異常類? –

+0

@IlkerMutlu類是ErrorException。這也很奇怪,因爲它是一個普通的例外。 –

+0

然後你可以做的就是將''''ldap_bind'''調用包裝在try catch塊中。 –

回答

2

這是預期的行爲爲Laravel。 Laravel會將任何錯誤轉換爲ErrorException實例。以下是Illuminate/Foundation/Bootstrap/HandleExceptions.php類中的bootstrap()方法。

public function bootstrap(Application $app) 
{ 
    $this->app = $app; 

    error_reporting(-1); 

    set_error_handler([$this, 'handleError']); 

    set_exception_handler([$this, 'handleException']); 

    register_shutdown_function([$this, 'handleShutdown']); 

    if (! $app->environment('testing')) { 
     ini_set('display_errors', 'Off'); 
    } 
} 

error_reporting(-1);將設置PHP報告所有錯誤(閱讀更多here)。

雖然這部分代碼:

set_error_handler([$this, 'handleError']); 

將設置一個自定義錯誤處理程序。如果您檢查handleError()方法,很明顯Laravel會將任何錯誤轉換爲ErrorException實例。

public function handleError($level, $message, $file = '', $line = 0, $context = []) 
{ 
    if (error_reporting() & $level) { 
     throw new ErrorException($message, 0, $level, $file, $line); 
    } 
} 

瞭解更多關於自定義錯誤處理程序here

希望這個清楚的事情。 :)

0

不確定原因,因爲我沒有寫它,但我認爲它的工作方式使記錄更容易。

警告會記錄在php的錯誤日誌中,但不可能將其他信息作爲上下文一起傳遞。

如果該警告變成異常,那麼您可以將異常傳遞給記錄器以及其他信息,例如命中的路由,請求變量等等,並將所有內容記錄在一起。您還可以通過將問題指定爲日誌,調試,信息,通知,警告,錯誤,危急,警報和緊急情況,並通過獨白來處理問題的嚴重性,並根據您的需要處理每個問題。這會創建一個更容易閱讀的日誌,並使您的代碼更易於調試。

此外,正如其他人所指出的那樣,它也可以讓你做你的嘗試catch塊的工作,我相信也創造整潔和乾淨的代碼不是試圖去檢查是否存在變量=== false