1. Ngoại lệ (Exception) là cái khỉ gì?
Bạn đã nghe nhiều đến Bug (hay còn gọi là lỗi) hoặc ngoại lệ trong lập trình rồi nhỉ?
Ví dụ thế này, bỗng một ngày đẹp trời bạn lướt facebook và bấm thả tim vào ảnh Crush của mình.
Nhưng mà Fb lại bị lỗi khiến bạn không thể bấm thả tim được (Số trời định =))).
Yên tâm, đây chỉ là lỗi kỹ thuật thôi.
Điều này xảy ra mà các lập trình viên của Facebook không ngờ tới.
Một ví dụ nữa, khi bạn đăng bài Facebook chẳng hạn. Bạn muốn post tấm hình bạn vừa chụp lên Facebook, theo quy định thì Facebook sẽ giảm chất lượng của tất cả các tấm ảnh tải lên.
Nhưng hôm đấy máy chủ của Facebook bị "đơ" và không giảm dung lượng tấm ảnh của bạn.
Đây là một ngoại lệ, xảy ra bên ngoài các trường hợp thông thường.
Túm lại, để đơn giản.
Bạn có thể hiểu là, chúng ta lập trình và mong muốn nó hành động nào đó.
Và tất cả các hành động khác với mong muốn thì nó là ngoại lệ (Exception).
Dĩ nhiên là bạn sẽ không muốn những ngoại lệ này phá hỏng chương trình của bạn rồi.
Vì thế, bạn cần xử lý ngoại lệ.
Bài này mình sẽ giúp bạn hiểu thêm về:
-
Ví dụ về xử lý lỗi trong PHP
-
Sự khác biệt giữa lỗi và ngoại lệ
2. Xử lý lỗi trong PHP (PHP Error handling)
Khi lỗi xảy ra, PHP hiển thị lỗi với một số thông tin để giúp bạn biết lỗi đó là gì và nằm ở chỗ nào.
Dĩ nhiên là thông báo lỗi này không được thân thiện cho lắm.
Nên người dùng sẽ chẳng hiểu là lỗi gì. Họ chỉ biết là họ đang có trải nghiệm tệ.
Vì thế, để tránh làm các "Thượng đế" phật lòng.
PHP cung cấp một số cách để xử lý lỗi.
Chúng ta sẽ tìm hiểu về 3 phương pháp xử lý lỗi sau đây:
-
Die statements - hàm
die
là hàm kết hợp giữa echo và hàm thoát lại với nhau. Nó phù hợp khi chúng ta muốn hiển thị một tin nhắn và ngừng lại kịch bản thực thi khi gặp lỗi.
-
Custom error handlers - Đây là phương pháp chúng ta tự thiết lập để xử lý mỗi khi xảy ra lỗi.
-
PHP error reporting - Lỗi tùy thuộc vào thiết lập của trình report lỗi của PHP. Phương pháp này rất hữu ích khi bạn chẳng có ý tưởng gì về nguyên nhân xảy ra lỗi. Các thông tin về lỗi sẽ giúp bạn nhận thức lỗi và tìm kiếm cách xử lý.
3. Ví dụ về cách xử lý lỗi trong chương trình PHP
Trước tiên chúng ta thử đến với một số lỗi cơ bản.
Ví dụ: Chúng ta đang viết một chương trình PHP để thực hiện chia 2 số với nhau.
Đoạn code PHP cho chương trình trên như sau:
Giả sử bạn đã lưu file simple_error
ở trong thư mục phptuts
.
Mở đường dẫn này http://localhost/phptuts/simple_error.php
trên trình duyệt.
Chúng ta nhận được kết quả như sau:
Ví dụ về lỗi đơn giản trong chương trình PHP
Như các bạn có thể nhìn thấy ở kết quả trên, chương trình xảy ra lỗi và hiển thị lỗi cho người dùng thấy.
Việc này là không chuyên nghiệp và khiến khách hàng khó chịu.
Chúng ta thử sửa đổi chương trình trên, viết cho nó một cách xử lý trong trường hợp này:
Lưu code lại và lại chạy tệp http://localhost/phptuts/error_handling.php
trên trình duyệt.
Xử lý lỗi theo cách thông thường
Chúng ta nhận được thông báo là không thể chia hết cho 0.
Cách thông báo lỗi này thân thiện hơn là cách ở trên phải không?
Bây giờ, hãy thử một ví dụ khác mà chúng ta sử dụng custom error handlers
Mở đường dẫn của file này http://localhost/phptuts/custom_error_handler.php
trên trình duyệt.
Bây giờ bạn thấy lỗi được hiển thị thế nào?
Sử dụng custom error handlers để xử lý lỗi trong chương trình PHP
Như bạn thấy đó, custom error handlers cho phép chúng ta tùy chỉnh tin nhắn thông báo lỗi cho thân thiện và rõ ràng hơn.
Bây giờ hãy thử xem ví dụ về loại report lỗi của PHP xem sao.
Error Reporting Function có cú pháp như sau:
Ở đây:
-
error_reporting là tên của hàm report lỗi được PHP cung cấp sẵn,
-
$reporting_level là tham số tùy chọn cho phép chúng ta tùy chọn cấp độ report lỗi. Nếu không chỉ định cấp độ report lỗi, PHP sẽ sử dụng báo cáo mặc định được quy định trong file php.ini
Các cấp độ report lỗi trong error_reporting
Cấp độ Report lỗi |
Mô tả |
error_reporting(E_WARNING); |
Chỉ có cảnh báo lỗi, không ngừng việc thực thi chương trình |
error_reporting(E_NOTICE); |
Hiển thị, thông báo rằng có khả năng chương trình chạy bình thường hoặc lỗi |
error_reporting(E_USER_ERROR); |
Màn hình của người dùng sẽ hiện ra lỗi |
error_reporting(E_USER_WARNING); |
Màn hình của người dùng tạo tin nhắn cảnh báo |
error_reporting(E_USER_NOTICE); |
Màn hình của người dùng hiện ra thông báo lỗi |
error_reporting(E_RECOVERABLE_ERROR); |
Hiển thị lỗi không trí mạng và có thể điều chỉnh bằng cách sử dụng custom error handlers |
error_reporting(E_ALL); |
Hiển thị tất cả lỗi và cảnh báo |
4. Sự khác nhau của Lỗi (Errors) và Ngoại lệ (Exception)
Ngoại lệ (Exception) là trường hợp được ném và bắt trong khi lỗi thường không thể thu hồi lại.
Exception được xử lý trong hướng đối tượng.
Điều này có nghĩa là khi ngoại lệ được ném ra, một đối tượng ngoại lễ sẽ được tạo và chứa thông tin chi tiết về ngoại lệ đó.
Dưới đây là một số phương thức của đối tượng Exception.
Phương thức getMessage():
Phương thức getMessage()
hiển thị tin nhắn ngoại lệ:
Phương thức getCode():
Phương thức getCode()
hiển thị các mã số là đại diện của các loại ngoại lệ.
Phương thức getFile():
Phương thức getFile()
hiển thị tên các tập tin và đường dẫn nơi xảy ra ngoại lệ.
Phương thức getLine():
Phương thức getLine()
hiển thị các dòng xảy ra ngoại lệ:
Phương thức getTrace():
Phương thức getTrace()
hiển thị một loạt các dấu vết trước chương trình xảy ra ngoại lệ:
Phương thức getPrevious():
Phương thức getPrevious()
hiển thị các ngoại lệ trước khi xảy ra trường hợp hiện tại:
Phương thức getTraceAsString():
Phương thức getTraceAsString()
hiển thị một loạt các dấu vết của ngoại lệ như một chuỗi thay vì một mảng:
Phương thức __toString():
Phương thức __toString()
hiển thị toàn bộ ngoại lệ như một chuỗi.
Cú pháp để ném ra một ngoại lệ
Ở đây chúng ta có:
-
throw là keyword sử dụng để ném ra một ngoại lệ
-
new Exception(...) tạo ra một đối tượng ngoại lệ và truyền chuỗi "
This is an exception example
" như một tham số.
Đối với đoạn mã trên thì chúng ta nhận được thông báo như sau:
Sử dụng throw keyword để ném ra một ngoại lệ
Bây giờ chúng ta sẽ xem một ví dụ sử dụng try...catch
để xử lý ngoại lệ.
5. Ví dụ sử dụng Try Catch PHP để xử lý ngoại lệ
Ví dụ sử về cách sử dụng try catch để xử lý ngoại lệ trong Lập trình PHP
Cú pháp của try catch
như sau:
Giải thích cú pháp try catch php:
-
try{...} đây là block code thực thi nói rằng, có thể nó sẽ xảy ra ngoại lệ.
-
catch (Exception $e){...} Đây là block code sử dụng để bắt ngoại lệ được ném ra và gán đối tượng ngoại lệ cho biến
$e
.
Ví dụ bên dưới đây sẽ cố tình ném ra một ngoại lệ và bắt lại nó:
Mở đường dẫn http://localhost/phptuts/exception_handling.php
bạn sẽ nhận được kết quả như sau:
Kết quả của một ví dụ sử dụng try catch php để xử lý ngoại lệ
Nó cũng có thể tạo nhiều ngoại lệ cho một cấu trúc try tùy theo kiểu của ngoại lệ được ném ra.
6. Multiple Exceptions (Nhiều ngoại lệ)
Multiple Exceptions sử dụng nhiều block try...catch
để cố gắng bắt các ngoại lệ được ném ra.
Multiple Exception có ích khi:
-
Bạn muốn hiển thị thông điệp tùy thuộc vào ngoại lệ được ném ra
-
Bạn muốn thực hiện một hành động độc đáo tùy thuộc vào ngoại lệ được ném ra.
Sơ đồ dưới đây cho bạn thấy cách hoạt động của Multiple Exceptions
Sơ đồ xử lý của Multiple Exceptions
Ví dụ về cách sử dụng Multiple Exceptions trong PHP:
Ở ví dụ bên dưới đây chúng ta dự kiến cho 2 trường hợp ngoại lệ xảy ra:
Chạy chương trình và chúng ta nhận được kết quả:
Chương trình xử lý khi rơi vào trường hợp chia cho số 0
Bây giờ chúng ta thử truyền vào một số là -1
thử xem sao.
Chạy chương trình như vừa rồi và bạn nhận được kết quả là gì?
Bạn đã hiểu hơn về Try Catch trong PHP rồi đấy!
Qua bài hướng dẫn xử lý lỗi và ngoại lệ với try catch PHP này bạn đã biết:
-
Lỗi là kết quả bất ngờ của chương trình lập trình
-
Xử lý Lỗi cải thiện hiệu suất của ứng dụng
-
PHP đã xây dựng các hàm để có thể được sử dụng tùy chỉnh báo cáo lỗi theo cấp độ
-
Exceptions (Ngoại lệ) thì giống như lỗi, nhưng chúng ta có thể sử dụng try catch php để bắt ngoại lệ.
-
Hiển thị thông tin về lỗi cho người dùng thấy được là không tốt đối với trải nghiệm cũng như vấn đề bảo mật.
* Trong khóa học Lập trình web với PHP bạn sẽ được hướng dẫn kỹ càng về cách xử lý ngoại lệ thường gặp trong lập trình web.
Chúc bạn học tốt!