PHP - 錯誤處理

你好,有志於PHP開發的們!今天,我們將要深入探索PHP中錯誤處理的精彩世界。別擔心如果你是編程新手;我會一步步指導你理解每個概念,就像我這些年來對無數學生所做的那樣。所以,來一杯咖啡(或者你喜歡的飲料),我們開始吧!

PHP - Error Handling

die() 函數

我們從一個簡單但強大的函數開始:die()。這個函數就像在你的代碼中按下了緊急停止按鈕。當PHP遇到die()時,它會立即停止執行,並輸出一個消息。

這裡有一個基本示例:

<?php
$file = fopen("important_file.txt", "r");
if (!$file) {
die("哦不!無法打開文件。");
}
echo "如果你看到這個,文件已經成功打開!";
?>

在這段代碼中,我們試圖打開一個文件。如果失敗,die()會停止一切,並顯示我們的自定義消息。這就像告訴PHP:“如果你做不到這點,那就停下來告訴我!”

錯誤處理函數

現在,我們來提升我們的錯誤處理技能,使用一個自定義的錯誤處理函數。這就像有了一個專屬於你自己的錯誤處理助手。

這是如何創建的:

<?php
function myErrorHandler($errno, $errstr, $errfile, $errline) {
echo "<b>哦哦!出錯了:</b><br>";
echo "錯誤:[$errno] $errstr<br>";
echo "錯誤在第 $errline 行的 $errfile<br>";
}

set_error_handler("myErrorHandler");

// 來觸發一個錯誤
echo($undefined_variable);
?>

在這個示例中,我們創建了一個名為myErrorHandler的函數,它提供了關於任何發生錯誤的詳細信息。然後我們告訴PHP使用這個函數作為set_error_handler()。當我們試圖輸出一個未定義的變量時,我們的自定義錯誤處理器會介入,提供一個友好且信息豐富的消息。

ArithmeticError 類

PHP 7引入了多個新的錯誤類,包括ArithmeticError。當數學運算中發生錯誤時,會拋出這個類。

讓我們看看它在實際中的應用:

<?php
$number = 1;
try {
$result = $number << -1;
} catch (ArithmeticError $e) {
echo "哦哦!發生了數學錯誤:" . $e->getMessage();
}
?>

在這裡,我們試圖使用負數進行位運算,這是不允許的。PHP會用ArithmeticError捕獲這個錯誤,我們從容地處理它。

DivisionByZeroError

記得上數學課時,老師說過你不能除以零嗎?嗯,PHP記得!當你試圖除以零時,會拋出DivisionByZeroError

<?php
function divide($numerator, $denominator) {
if ($denominator == 0) {
throw new DivisionByZeroError("哇!你不能除以零!");
}
return $numerator / $denominator;
}

try {
echo divide(10, 0);
} catch (DivisionByZeroError $e) {
echo "錯誤:" . $e->getMessage();
}
?>

在這個示例中,我們創建了一個divide函數,它會檢查除數是否為零。如果是,它會拋出一個DivisionByZeroError並帶有自定義消息。

ArgumentCountError

你有没有打过電話卻忘了要說什麼?嗯,ArgumentCountError就是PHP在說:“嘿,你忘記告訴我一些重要的東西了!”

<?php
function greet($name) {
return "你好,$name!";
}

try {
echo greet();  // 哦,我們忘記提供名字了!
} catch (ArgumentCountError $e) {
echo "錯誤:" . $e->getMessage();
}
?>

在這種情況下,我們調用了greet函數,卻沒有提供名字。PHP會拋出ArgumentCountError,我們捕獲並處理它。

TypeError

當一個值不是期望的類型時,會拋出TypeError。這就像訂了一份披薩,卻拿到了漢堡!

<?php
function addNumbers(int $a, int $b) {
return $a + $b;
}

try {
echo addNumbers("5", "10");  // 我們傳遞的是字符串,而不是整數!
} catch (TypeError $e) {
echo "哦哦! " . $e->getMessage();
}
?>

在這裡,我們的addNumbers函數期望整數,但我們傳遞了字符串。PHP會捕獲這種類型不匹配並拋出TypeError

PHP中的異常處理

PHP中的異常就像馬戲團中的安全網。它們在錯誤變成大問題之前捕獲它們。讓我們看看如何使用它們:

<?php
function checkAge($age) {
if ($age < 0) {
throw new Exception("年齡不能是負數!");
}
if ($age < 18) {
throw new Exception("對不起,你必須年滿18歲。");
}
return "歡迎!你已經夠大了。";
}

try {
echo checkAge(15);
} catch (Exception $e) {
echo "錯誤:" . $e->getMessage();
} finally {
echo "<br>感謝您使用我們的年齡檢查器!";
}
?>

在這個示例中,我們正在檢查某人是否有足夠的年齡進入。我們使用try嘗試代碼,catch來處理任何異常,finally無論是否拋出異常都會執行代碼。

創建自定義異常處理器

最後,讓我們創建自己的自定義異常處理器。這就像設計自己的錯誤消息系統!

<?php
class CustomException extends Exception {
public function errorMessage() {
$errorMsg = '錯誤在第 '.$this->getLine().' 行的 '.$this->getFile()
.': <b>'.$this->getMessage().'</b> 不是有效的電子郵件地址';
return $errorMsg;
}
}

$email = "[email protected]";

try {
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
throw new CustomException($email);
}
} catch (CustomException $e) {
echo $e->errorMessage();
}
?>

在這裡,我們創建了一個CustomException類,它為無效的電子郵件地址提供了詳細的錯誤消息。然後我們使用這個自定義異常來處理驗證電子郵件地址時的錯誤。

至此,我們已經涵蓋了PHP中的多種錯誤處理技巧。記住,好的錯誤處理就像系安全帶 - 在你真正需要之前,它可能看起來是多餘的。繼續練習這些概念,很快你就能像專家一樣處理錯誤了!

方法 描述
die() 結束腚本執行並輸出消息
set_error_handler() 設置用戶定義的錯誤處理函數
try-catch 用於異常處理
throw 用於拋出異常
finally 指定無論是否拋出異常都要運行的代碼
自定義錯誤類 允許創建特定的錯誤類型

開心地編程,並記住 - 在編程中,錯誤只是學習和改進你代碼的機會!

Credits: Image by storyset