今天我們來談談PHP里的try{}代碼塊。try{}通常用來包裹一些有可能拋出異常的代碼。如果try{}代碼塊中的代碼成功執行則繼續執行下面的代碼,否則控制權轉移到catch{}代碼塊并拋出一個異常。下面我們就來看一個實際的例子:
try { $db = new PDO('mysql:host=localhost;dbname=test', 'root', ''); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->beginTransaction(); $db->exec("INSERT INTO users (firstname, lastname, email) VALUES ('John', 'Doe', 'johndoe@example.com')"); $db->commit(); } catch(PDOException $e) { $db->rollback(); echo "Error: ".$e->getMessage(); }
上面的代碼中我們使用了PDO來連接數據庫并插入了一條用戶記錄。但是如果在執行這段代碼的過程中出現了錯誤,我們需要使用try{}代碼塊來捕獲錯誤并進行處理。catch{}代碼塊里的PDOException就是用來捕獲數據庫操作過程中可能會出現的異常。
除了捕獲PDOException之外,我們還可以捕獲其他類型的異常。比如我們在一個函數里手動拋出一個異常,可以像下面這樣進行捕獲:
function divide($x, $y) { if($y == 0) { throw new Exception("Division by zero."); } return $x / $y; } try { $result = divide(100, 0); echo $result; } catch(Exception $e) { echo "Caught exception: ".$e->getMessage(); }
在這段代碼里,我們在divide()函數里手動拋出了一個異常,當$y等于0的時候,代碼塊里的throw new Exception("Division by zero.");就會執行。當我們在try{}代碼塊里調用divide()函數時發現$y等于0,就會拋出一個異常并跳轉到catch{}代碼塊中。
除了使用catch{}代碼塊來捕獲異常外,我們還可以使用finally{}代碼塊。finally{}代碼塊只有在try{}代碼塊執行完畢后才會執行,而且它不管try{}代碼塊是否發生了異常都會執行。比如下面這段代碼:
try { echo "This is try block."; throw new Exception("Exception occurred."); } catch(Exception $e) { echo "Caught exception: ".$e->getMessage(); } finally { echo "This is finally block."; }
這段代碼中我們在try{}代碼塊中拋出了一個異常,因此catch{}代碼塊會被執行。但是無論如何finally{}代碼塊都會在try{}執行完成后被執行。
總結一下,try{}代碼塊主要用來捕獲可能會拋出異常的代碼段。我們可以在catch{}代碼塊中捕獲異常,并進行相應的處理。如果需要在代碼塊執行完成后執行一些代碼,可以使用finally{}代碼塊。catch{}和finally{}都是可選的,可以只使用try{}代碼塊。