PHP - Xử lý Lỗi

Xin chào các bạn đang học lập trình PHP! Hôm nay, chúng ta sẽ cùng nhau khám phá thế giới thú vị của việc xử lý lỗi trong PHP. Đừng lo lắng nếu bạn mới bắt đầu học lập trình; tôi sẽ hướng dẫn bạn từng khái niệm một cách chi tiết, giống như tôi đã làm cho hàng trăm học sinh trong những năm dạy học của mình. Nào, hãy lấy một tách cà phê (hoặc đồ uống yêu thích của bạn) và cùng bắt đầu nhé!

PHP - Error Handling

Hàm die()

Hãy bắt đầu với một hàm đơn giản nhưng mạnh mẽ: die(). Hàm này giống như ấn nút dừng khẩn cấp trong mã của bạn. Khi PHP gặp die(), nó sẽ dừng việc thực thi ngay lập tức và hiển thị một thông báo.

Dưới đây là một ví dụ cơ bản:

<?php
$file = fopen("important_file.txt", "r");
if (!$file) {
die("Oh no! The file couldn't be opened.");
}
echo "If you see this, the file was opened successfully!";
?>

Trong đoạn mã này, chúng ta đang cố gắng mở một tệp. Nếu không thể mở, die() sẽ dừng mọi thứ và hiển thị thông báo tùy chỉnh của chúng ta. Đó là như nói với PHP, "Nếu bạn không thể làm điều này, hãy dừng lại và cho tôi biết!"

Hàm Xử lý Lỗi Tùy chỉnh

Bây giờ, hãy nâng cao trò chơi xử lý lỗi của chúng ta với một hàm xử lý lỗi tùy chỉnh. Điều này giống như có một trợ lý cá nhân để xử lý lỗi.

Dưới đây là cách bạn có thể tạo một hàm như vậy:

<?php
function myErrorHandler($errno, $errstr, $errfile, $errline) {
echo "<b>Oops! Something went wrong:</b><br>";
echo "Error: [$errno] $errstr<br>";
echo "Error on line $errline in $errfile<br>";
}

set_error_handler("myErrorHandler");

// Hãy gây ra một lỗi
echo($undefined_variable);
?>

Trong ví dụ này, chúng ta đã tạo một hàm叫做 myErrorHandler cung cấp thông tin chi tiết về bất kỳ lỗi nào xảy ra. Sau đó, chúng ta告诉 PHP sử dụng hàm này với set_error_handler(). Khi chúng ta cố gắng echo một biến không xác định, hàm xử lý lỗi tùy chỉnh của chúng ta sẽ được kích hoạt, cung cấp một thông báo thân thiện và chi tiết.

Lớp ArithmeticError

PHP 7 đã引入 một số lớp lỗi mới, bao gồm ArithmeticError. Lớp này được抛出 khi xảy ra lỗi trong các phép toán.

Hãy xem nó trong hành động:

<?php
$number = 1;
try {
$result = $number << -1;
} catch (ArithmeticError $e) {
echo "Oops! A math error occurred: " . $e->getMessage();
}
?>

Ở đây, chúng ta đang cố gắng thực hiện một phép dịch bit với một số âm, điều này không được phép. PHP bắt lỗi này với ArithmeticError, và chúng ta xử lý nó một cách từ tốn.

DivisionByZeroError

Nhớ lại khi giáo viên toán học của bạn bảo rằng bạn không thể chia cho zero không? Well, PHP cũng nhớ điều đó! DivisionByZeroError được抛出 khi bạn cố gắng chia cho zero.

<?php
function divide($numerator, $denominator) {
if ($denominator == 0) {
throw new DivisionByZeroError("Whoa there! You can't divide by zero!");
}
return $numerator / $denominator;
}

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

Trong ví dụ này, chúng ta đã tạo một hàm divide kiểm tra nếu mẫu số là zero. Nếu nó là, nó sẽ ném một DivisionByZeroError với một thông báo tùy chỉnh.

ArgumentCountError

Bạn có bao giờ gọi ai đó và quên mất điều bạn muốn nói không? Well, ArgumentCountError là cách PHP nói, "Hey, bạn quên mất điều quan trọng để nói với tôi!"

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

try {
echo greet();  // Oops, chúng ta quên cung cấp tên!
} catch (ArgumentCountError $e) {
echo "Error: " . $e->getMessage();
}
?>

Trong trường hợp này, chúng ta đang gọi hàm greet mà không cung cấp tên. PHP ném một ArgumentCountError, mà chúng ta bắt và xử lý.

TypeError

TypeError được抛出 khi một giá trị không phải là loại mong đợi. Điều này giống như đặt hàng một pizza và nhận được một汉堡包 thay vì!

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

try {
echo addNumbers("5", "10");  // Chúng ta đang truyền các chuỗi, không phải số nguyên!
} catch (TypeError $e) {
echo "Oops! " . $e->getMessage();
}
?>

Ở đây, hàm addNumbers của chúng ta mong đợi các số nguyên, nhưng chúng ta đang truyền các chuỗi. PHP bắt sự không khớp này và ném một TypeError.

Xử lý Ngoại lệ trong PHP

Ngoại lệ trong PHP giống như mạng an toàn trong cirque. Chúng bắt lỗi trước khi chúng trở thành những vấn đề lớn. Hãy xem cách sử dụng chúng:

<?php
function checkAge($age) {
if ($age < 0) {
throw new Exception("Age can't be negative!");
}
if ($age < 18) {
throw new Exception("Sorry, you must be 18 or older.");
}
return "Welcome! You're old enough.";
}

try {
echo checkAge(15);
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
} finally {
echo "<br>Thanks for using our age checker!";
}
?>

Trong ví dụ này, chúng ta đang kiểm tra xem ai đó có đủ tuổi hay không. Chúng ta sử dụng try để thử mã, catch để xử lý bất kỳ ngoại lệ nào và finally để thực thi mã bất kể có ngoại lệ hay không.

Tạo bộ Xử lý Ngoại lệ Tùy chỉnh

Cuối cùng, hãy tạo bộ xử lý ngoại lệ tùy chỉnh của riêng chúng ta. Điều này giống như thiết kế hệ thống thông báo lỗi riêng của bạn!

<?php
class CustomException extends Exception {
public function errorMessage() {
$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
return $errorMsg;
}
}

$email = "[email protected]";

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

Ở đây, chúng ta đã tạo một lớp CustomException cung cấp thông báo lỗi chi tiết cho địa chỉ email không hợp lệ. Chúng ta sau đó sử dụng ngoại lệ tùy chỉnh này để xử lý lỗi khi xác minh địa chỉ email.

Và đó là tất cả! Chúng ta đã bao gồm một loạt các kỹ thuật xử lý lỗi trong PHP. Nhớ rằng, xử lý lỗi tốt giống như mang dây an toàn - nó có thể看起来 không cần thiết cho đến khi bạn thực sự cần nó. Hãy tiếp tục luyện tập các khái niệm này, và sớm bạn sẽ xử lý lỗi như một chuyên gia!

Phương pháp Mô tả
die() Dừng việc thực thi mã và hiển thị thông báo
set_error_handler() Đặt hàm xử lý lỗi tùy chỉnh
try-catch Sử dụng cho xử lý ngoại lệ
throw Sử dụng để ném ngoại lệ
finally Định nghĩa mã để thực thi bất kể ngoại lệ có xảy ra hay không
các lớp lỗi tùy chỉnh Cho phép tạo các loại lỗi cụ thể

Chúc các bạn lập trình vui vẻ, và nhớ rằng - trong lập trình, lỗi chỉ là cơ hội để học hỏi và cải thiện mã của bạn!

Credits: Image by storyset