您能否解釋一下 (PDOException $e) 和 PDOException($e->getMessage(), (int)$e->getCode()) 在這里的作用和含義?
try
{
$pdo = new PDO($attr, $user, $pass, $opts);
}
catch (PDOException $e)
{
throw new PDOException($e->getMessage(), (int)$e->getCode());
}
uj5u.com熱心網友回復:
讓我們比較一下這段代碼的輸出有和沒有 try catch
$pdo = new PDO('foo', 'username', 'password');
會給我們
PHP 致命錯誤:未捕獲的 PDOException:PDO::__construct():
引數 #1 ($dsn) 必須是 pdo.php:6 中的有效資料源名稱
堆疊跟蹤:
#0 C:\SERVER\www\htdocs\pdo。 php(6): PDO->__construct('foo', 'username' , 'password' )
#1 {main} 在第 6 行的 pdo.php 中拋出
注意用戶名和密碼可以在錯誤資訊中看到
現在嘗試捕捉并重新拋出
try
{
$pdo = new PDO('foo', 'username', 'password');
}
catch (PDOException $e)
{
throw new PDOException($e->getMessage(), (int)$e->getCode());
}
輸出將是
PHP Fatal error: Uncaught PDOException: PDO::__construct():
Argument #1 ($dsn) must be a valid data source name in pdo.php:12
Stack trace:
#0 {main}
thrown in pdo.php on line 12
如您所見,沒有用戶名或密碼。
這是使用這種笨拙代碼的唯一原因
uj5u.com熱心網友回復:
最好的起點是關于 Exceptions 的 PHP 手冊頁。
例外是一種強制錯誤處理機制——不是設定后續代碼必須主動檢查的標志,而是拋出例外會中止所有正在運行的代碼,直到它到達匹配的catch塊。如果沒有catch找到塊,則整個腳本退出。
catch塊使用與運算子相同的邏輯進行匹配-instanceof您命名一個類或介面,例外必須是相同的類、子類或實作該介面。然后你給一個變數名 - 在你的例子$e中,但它可以是你喜歡的任何名字 - PHP 將例外分配給該變數并運行catch塊的內容。
創建例外與創建任何其他物件相同 - 您使用new運算子。一旦創建,它們就可以具有屬性和方法,包括一個默認集,其中包括getMessage()和getCode(),它們回傳最初構造時傳遞的值。當您使用throw關鍵字時,它們的特殊行為會發生。
因此,您顯示的代碼:
- 運行一些可能引發例外的代碼 (
new PDO(...)) - 捕獲任何例外匹配
instanceof PDOException - 在該例外物件上查找“訊息”和“代碼”
- 創建一個新
PDOException物件 - 拋出那個新例外
結果本身幾乎沒有用 - 特別是,步驟 4 和 5 可以替換為throw $e,這基本上意味著“我已經查看了這個例外,但認為它仍然是一個問題;繼續尋找另一個匹配的catch塊”。如果您想在第 3 步和第 4 步之間做一些事情,例如記錄或清理,這有時會很有用。
正如在另一個答案中指出的那樣,它確實洗掉了回溯,否則可能會暴露憑據。通過在 PHP 配置中設定zend.exception_ignore_args=true會更好地處理。PHP 8.2 還將有一個新功能,可以自動隱藏回溯中的某些引數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/450936.html
