Ví dụ về thử bắt lỗi PHP: Hướng dẫn xử lý lỗi và ngoại lệ
Ngoại lệ là gì?
Lỗi là một kết quả chương trình không mong muốn mà chính chương trình đó không thể xử lý được.
Lỗi được giải quyết bằng cách sửa chương trình. Một ví dụ về lỗi là một vòng lặp vô hạn không bao giờ ngừng thực thi.
Một ngoại lệ là kết quả chương trình không mong muốn có thể được chính chương trình xử lý.
Ví dụ về ngoại lệ bao gồm việc cố gắng mở một tệp không tồn tại.
Ngoại lệ này có thể được xử lý bằng cách tạo tệp hoặc cung cấp cho người dùng tùy chọn tìm kiếm tệp.
Tại sao xử lý ngoại lệ?
- Tránh các kết quả không mong muốn trên các trang của chúng tôi, điều này có thể gây khó chịu hoặc gây khó chịu cho người dùng cuối của chúng tôi
- Cải thiện tính bảo mật cho các ứng dụng của chúng tôi bằng cách không tiết lộ thông tin mà người dùng độc hại có thể sử dụng để tấn công các ứng dụng của chúng tôi
- Ngoại lệ Php được sử dụng để thay đổi luồng thông thường của chương trình nếu xảy ra bất kỳ lỗi nào có thể dự đoán được.
Xử lý lỗi PHP
Khi xảy ra lỗi, tùy thuộc vào cài đặt cấu hình của bạn, PHP hiển thị thông báo lỗi trên trình duyệt web kèm theo thông tin liên quan đến lỗi xảy ra.
PHP cung cấp một số cách để xử lý lỗi.
Chúng ta sẽ xem xét ba (3) phương pháp thường được sử dụng;
- Tuyên bố chết– chức năng die kết hợp chức năng echo và exit thành một. Nó rất hữu ích khi chúng ta muốn xuất thông báo và dừng thực thi tập lệnh khi xảy ra lỗi.
- Trình xử lý lỗi tùy chỉnh – đây là các hàm do người dùng xác định và được gọi bất cứ khi nào xảy ra lỗi.
- Báo cáo lỗi PHP – thông báo lỗi tùy thuộc vào cài đặt báo cáo lỗi PHP của bạn. Phương pháp này rất hữu ích trong môi trường phát triển khi bạn không biết nguyên nhân gây ra lỗi. Thông tin được hiển thị có thể giúp bạn gỡ lỗi ứng dụng của mình.
Ví dụ xử lý lỗi
Bây giờ chúng ta hãy xem một số ví dụ đơn giản về quy trình xử lý lỗi.
Giả sử chúng ta đã phát triển một ứng dụng sử dụng tệp văn bản để lưu trữ dữ liệu. Chúng tôi có thể muốn kiểm tra sự tồn tại của tệp trước khi cố gắng đọc dữ liệu từ nó.
Đoạn mã dưới đây thực hiện ví dụ trên.
<?php $denominator = 0; echo 2 / $denominator; ?>
Giả sử bạn đã lưu file simple_error.php trong thư mục phptuts, hãy mở URL http://localhost/phptuts/simple_error.php
Bạn sẽ nhận được kết quả sau
Như bạn có thể thấy từ các kết quả trên, nó làm cho ứng dụng của chúng ta trông thiếu chuyên nghiệp và có thể gây khó chịu cho người dùng.
Chúng ta sẽ sửa đổi đoạn code trên và viết một trình xử lý lỗi cho ứng dụng
<?php $denominator = 0; if ($denominator != 0) { echo 2 / $denominator; } else { echo "cannot divide by zero (0)"; } ?>
Giả sử bạn đã lưu đoạn mã trên dưới dạng error_handling.php, hãy mở URL http://localhost/phptuts/error_handling.php
Lưu ý: một biện pháp bảo mật tốt là hiển thị thông báo như trên thay vì hiển thị thông báo như "Không tìm thấy tệp".
Hãy xem một ví dụ khác sử dụng trình xử lý lỗi tùy chỉnh.
Trình xử lý lỗi tùy chỉnh sẽ được đặt làm chức năng xử lý lỗi PHP mặc định và về cơ bản sẽ hiển thị số lỗi và thông báo.
Đoạn mã dưới đây minh họa việc thực hiện ví dụ trên
<?php function my_error_handler($error_no, $error_msg) { echo "Opps, something went wrong:"; echo "Error number: [$error_no]"; echo "Error Description: [$error_msg]"; } set_error_handler("my_error_handler"); echo (5 / 0); ?>
Mở URL http://localhost/phptuts/custom_error_handler.php bạn sẽ nhận được kết quả sau
Như bạn có thể thấy từ ví dụ trên, trình xử lý lỗi tùy chỉnh rất mạnh mẽ theo nghĩa là
- Chúng cho phép chúng tôi tùy chỉnh các thông báo lỗi.
- Trình xử lý lỗi tùy chỉnh cũng có thể bao gồm việc ghi nhật ký lỗi vào tệp/cơ sở dữ liệu, gửi email cho nhà phát triển, v.v.
Bây giờ chúng ta hãy xem loại xử lý lỗi thứ ba. Chúng ta sẽ sử dụng hàm error_reporting được tích hợp sẵn trong PHP. Nó có cú pháp cơ bản sau
<?php error_reporting($reporting_level); ?>
ĐÂY,
- “error_reporting” là chức năng báo lỗi của PHP
- “$reporting_level” là tùy chọn, có thể được sử dụng để đặt cấp độ báo cáo. Nếu không có mức báo cáo nào được chỉ định, PHP sẽ sử dụng mức báo cáo lỗi mặc định như được chỉ định trong tệp php.ini.
Cấp độ báo cáo | Mô tả | Ví dụ |
---|---|---|
E_CẢNH BÁO | Chỉ hiển thị thông báo cảnh báo. Không dừng việc thực thi tập lệnh | error_reporting(E_WARNING); |
E_NOTICE | Hiển thị các thông báo có thể xảy ra trong quá trình thực hiện chương trình bình thường hoặc có thể là lỗi. | error_reporting(E_ THÔNG BÁO); |
E_USER_ERROR | Hiển thị lỗi do người dùng tạo tức là trình xử lý lỗi tùy chỉnh | error_reporting(E_ USER_ERROR); |
E_USER_CẢNH BÁO | Hiển thị thông báo cảnh báo do người dùng tạo | error_reporting(E_USER_WARNING); |
E_USER_NOTICE | Hiển thị thông báo do người dùng tạo | error_reporting(E_USER_NOTICE); |
E_RECOVERABLE_ERROR | Hiển thị lỗi không nghiêm trọng và có thể được xử lý bằng trình xử lý lỗi tùy chỉnh | error_reporting(E_RECOVERABLE_ERROR); |
E_ALL | Hiển thị tất cả các lỗi và cảnh báo | error_reporting(E_ ALL); |
Sự khác biệt giữa Lỗi và Ngoại lệ
- Các ngoại lệ được ném ra và có ý định bị bắt trong khi các lỗi thường không thể khắc phục được.
- Ngoại lệ được xử lý theo cách hướng đối tượng. Điều này có nghĩa là khi một ngoại lệ được đưa ra, một đối tượng ngoại lệ sẽ được tạo ra để chứa thông tin chi tiết về ngoại lệ đó.
Bảng dưới đây hiển thị các phương thức đối tượng ngoại lệ
Phương pháp | Mô tả | Ví dụ |
---|---|---|
getMessage () | Hiển thị thông báo của ngoại lệ |
<?php echo $e->getMessage(); ?> |
nhận được mã() | Hiển thị mã số đại diện cho ngoại lệ |
<?php echo $e->getCode(); ?> |
có được file() | Hiển thị tên tệp và đường dẫn nơi xảy ra ngoại lệ |
<?php echo $e->getFile(); ?> |
theo hàng() | Hiển thị số dòng nơi xảy ra ngoại lệ |
<?php echo $e->getLine(); ?> |
getTrace() | Hiển thị một mảng vết lùi trước ngoại lệ |
<?php print_r( $e->getTrace()); ?> |
getPrevious() | Hiển thị ngoại lệ trước đó trước ngoại lệ hiện tại |
<?php echo $e->getPrevious(); ?> |
getTraceAsString() | Hiển thị dấu vết ngược lại của ngoại lệ dưới dạng chuỗi thay vì mảng |
<?php echo $e->getTraceAsString(); ?> |
__toString () | Hiển thị toàn bộ ngoại lệ dưới dạng chuỗi |
<?php echo $e->__toString(); ?> |
Dưới đây là cú pháp cơ bản để đưa ra ngoại lệ.
<?php throw new Exception("This is an exception example"); ?>
ĐÂY,
- “ném” là từ khóa dùng để ném ngoại lệ
- “Ngoại lệ mới(…)” tạo một đối tượng ngoại lệ và chuyển chuỗi “Đây là một ví dụ ngoại lệ” làm tham số thông báo.
Đoạn mã trên đưa ra thông báo sau.
Bây giờ chúng ta sẽ xem xét một ví dụ thực hiện các ngoại lệ ném và bắt.
Chúng tôi sẽ sửa đổi ví dụ trên và bao gồm thử, ném và bắt.
Nó có cú pháp cơ bản như sau.
<?php try { //code goes here that could potentially throw an exception } catch (Exception $e) { //exception handling code goes here } ?>
ĐÂY,
- “try{…}” là khối mã được thực thi có khả năng gây ra ngoại lệ
- “catch(Exception $e){…}” là khối mã bắt ngoại lệ được ném ra và gán đối tượng ngoại lệ cho biến $e.
Mã bên dưới hiển thị ví dụ ngoại lệ cơ bản với ngoại lệ thử, ném và bắt được triển khai.
Chương trình cố tình ném ra một ngoại lệ và sau đó bắt được.
<?php try { $var_msg = "This is an exception example"; throw new Exception($var_msg); } catch (Exception $e) { echo "Message: " . $e->getMessage(); echo ""; echo "getCode(): " . $e->getCode(); echo ""; echo "__toString(): " . $e->__toString(); } ?>
Mở URL http://localhost/phptuts/exception_handling.php Bạn sẽ nhận được kết quả sau.
Cũng có thể tạo nhiều ngoại lệ cho một câu lệnh thử php tùy thuộc vào loại ngoại lệ được đưa ra.
Xem bài viết trên MySQL, Truy cập dữ liệu PHP… để biết ví dụ triển khai nhiều ngoại lệ
Nhiều ngoại lệ
Nhiều ngoại lệ sử dụng nhiều khối bắt thử để xử lý các ngoại lệ được ném ra. Nhiều ngoại lệ hữu ích khi;
- Bạn muốn hiển thị một thông báo tùy chỉnh tùy thuộc vào ngoại lệ được ném
- Bạn muốn thực hiện một thao tác duy nhất tùy thuộc vào ngoại lệ được ném
Sơ đồ bên dưới minh họa cách hoạt động của nhiều ngoại lệ
Hãy xem một ví dụ sử dụng nhiều ngoại lệ.
Chúng tôi sẽ sửa đổi mã chia một số cho mẫu số được truyền vào.
Chúng tôi mong đợi hai loại trường hợp ngoại lệ sẽ xảy ra;
- Chia cho số không
- Chia cho số âm
Để đơn giản, chúng tôi sẽ chỉ hiển thị loại ngoại lệ trong khối bắt của chúng tôi.
Lớp Exception tích hợp trong PHP được sử dụng để đưa ra các ngoại lệ.
Chúng ta sẽ tạo hai lớp mở rộng lớp ngoại lệ và sử dụng chúng để đưa ra các ngoại lệ.
Mã dưới đây cho thấy việc thực hiện.
<?php class DivideByZeroException extends Exception {}; class DivideByNegativeException extends Exception {}; function process($denominator) { try { if ($denominator == 0) { throw new DivideByZeroException(); } else if ($denominator < 0) { throw new DivideByNegativeException(); } else { echo 25 / $denominator; } } catch (DivideByZeroException $ex) { echo "DIVIDE BY ZERO EXCEPTION!"; } catch (DivideByNegativeException $ex) { echo "DIVIDE BY NEGATIVE NUMBER EXCEPTION!"; } catch (Exception $x) { echo "UNKNOWN EXCEPTION!"; } } process(0); ?>
Kiểm tra mã
Chúng tôi sẽ cho rằng bạn đã lưu multiple_Exceptions.php trong thư mục phptuts.
Duyệt đến URL http://localhost/phptuts/multiple_exceptions.php
Quay lại tệp PHP và truyền -1 làm tham số như thể hiện trong sơ đồ sau.
Duyệt đến URL http://localhost/phptuts/multiple_exceptions.php.
Bạn nhận được kết quả gì? Truyền 3 làm tham số.
Bạn nhận được kết quả gì?
Tổng kết
- Lỗi là kết quả không mong muốn do mã PHP tạo ra
- Xử lý lỗi cải thiện hiệu suất ứng dụng
- PHP đã xây dựng sẵn các hàm có thể được sử dụng để tùy chỉnh cách PHP báo cáo lỗi
- Các ngoại lệ giống như lỗi, nhưng chúng có thể bị bắt bằng cách sử dụng khối bắt khi ném.
- Hiển thị thông báo lỗi hiển thị thông tin lỗi được coi là một biện pháp bảo mật kém.