Xin chào tất cả các mọi người, bài viết này mình xin trình bày về xử lý lỗi và Exception trong PHP, rất mong được sự theo dõi của mọi người
1) Xử lý lỗi
Xử lý lỗi là tiến trình phát hiện lỗi được tạo khi chạy code của bạn và sau đó thực hiện các hành động thích hợp. Nếu bạn xử lý lỗi không chính xác, thì có thể dẫn tới nhiều kết quả không mong đợi.
PHP có cung cấp các cơ chế giúp bắt lỗi, giám sát các lỗi và xử lý các lỗi có thể xảy ra khi lập trình.
1.1) Hàm die() và exit()
- Để bắt lỗi trong PHP ta có thể sử dụng hàm die() hoặc hàm exit().
- Khi dùng hàm die() hoặc exit() thì một message sẽ được bắn ra và chương trình sẽ bị dừng lại.
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">file_exists</span><span class="token punctuation">(</span><span class="token double-quoted-string string">"/path/to/data-file.txt"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// nếu chương trình chạy vào đây thì code ở phía sau sẽ không được thực thi</span> <span class="token function">exit</span><span class="token punctuation">(</span><span class="token double-quoted-string string">"Không tìm thấy file này!!!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token variable">$file</span><span class="token operator">=</span><span class="token function">fopen</span><span class="token punctuation">(</span><span class="token double-quoted-string string">"/path/to/data-file.txt"</span><span class="token punctuation">,</span><span class="token double-quoted-string string">"r"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">print</span> <span class="token double-quoted-string string">"Mở file thành công!!!"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// logic ....</span> <span class="token delimiter important">?></span></span> |
1.2) Tự định nghĩa hàm để xử lý lỗi trong PHP
Để tự định nghĩa hàm để xử lý lỗi thì ta có thể sử dụng cú pháp :
error_function(errno, errstr, errfile, errline, errcontext);
Hàm xử lý lỗi tùy chỉnh phải có ít nhất hai tham số (error_level và errstr) bắt buộc, ngoài ra nó có thêm ba tham số (errfile, errline và errcontext) không bắt buộc, như được mô tả dưới đây
- errno: Xác định mức độ lỗi, dưới dạng một số nguyên. Điều này tương ứng với hằng số cấp độ lỗi phù hợp (E_ERROR, E_WARNING, …)
- errstr: Xác định thông báo lỗi dưới dạng chuỗi
- errfile: Xác định tên file của tập lệnh trong đó xảy ra lỗi
- errline: Xác định số dòng mà lỗi xảy ra
- errcontext: Xác định một mảng chứa tất cả các biến và giá trị của chúng tồn tại tại thời điểm xảy ra lỗi. Tham số này rất hữu ích cho việc gỡ lỗi
Các cấp độ lỗi trong PHP
Cấp độ lỗi | Giá trị | Mô tả |
---|---|---|
E_ERROR | 1 | Một lỗi Runtime nghiêm trọng. Việc thực thi kịch bản được dừng lại ngay lập tức |
E_WARNING | 2 | Các lỗi không nghiêm trọng và việc thực thi script không bị dừng lại |
E_NOTICE | 8 | Một thông báo runtime. Cho biết rằng tập lệnh gặp phải lỗi có thể xảy ra, mặc dù tình huống cũng có thể xảy ra khi chạy tập lệnh bình thường |
E_USER_ERROR | 256 | Một thông báo lỗi do người dùng tạo ra. Điều này giống như một E_ERROR, ngoại trừ nó được tạo bởi tập lệnh PHP bằng cách sử dụng hàm trigger_error () chứ không phải là PHP engine |
E_USER_WARNING | 512 | Một thông điệp cảnh báo không trí mạng do người dùng tạo ra. Điều này giống như một E_WARNING, ngoại trừ nó được tạo bởi tập lệnh PHP bằng cách sử dụng hàm trigger_error () chứ không phải PHP engine |
E_USER_NOTICE | 1024 | Một thông báo thông báo do người dùng tạo. Điều này giống như một E_NOTICE, ngoại trừ nó được tạo bởi tập lệnh PHP bằng cách sử dụng hàm trigger_error () chứ không phải PHP engine |
E_STRIC | 2048 | Không hoàn toàn là một lỗi, nhưng được kích hoạt bất cứ khi nào PHP gặp mã có thể dẫn đến sự cố hoặc chuyển tiếp không tương thích |
E_ALL | 8189 | Tất cả các lỗi và cảnh báo, ngoại trừ E_STRICT trước PHP 5.4.0. |
Ví dụ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">function</span> <span class="token function">handleError</span><span class="token punctuation">(</span><span class="token variable">$error_no</span><span class="token punctuation">,</span> <span class="token variable">$error_msg</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token double-quoted-string string">"Opps, something went wrong:"</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token double-quoted-string string">"Error number: [<span class="token interpolation"><span class="token variable">$error_no</span></span>]"</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token double-quoted-string string">"Error Description: [<span class="token interpolation"><span class="token variable">$error_msg</span></span>]"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//thiết lập error handler</span> <span class="token function">set_error_handler</span><span class="token punctuation">(</span><span class="token double-quoted-string string">"handleError"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token punctuation">(</span><span class="token number">5</span> <span class="token operator">/</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span> |
Như vậy, 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.
2) Exception
Exception là một giải pháp quản lý lỗi kiểu hướng đối tượng
Nó là một class được xây dựng sẵn trong ngôn ngữ PHP
Một đối tượng Exception sẽ chứa các thông tin về nơi xảy ra lỗi (tên file, số dòng)
Một số từ khóa liên quan tới Exception
- Try : đoạn mã có khả năng xảy ra ngoại lệ nằm trong khối “try”. Nếu không xảy ra ngoại lệ mã sẽ tiếp tục như bình thường. Tuy nhiên nếu xảy ra ngoại lệ thì một ngoại lệ sẽ được ném ra.
- Throw : Ngoại lệ được kích hoạt. Mỗi “throw” phải bao gồm ít nhất một khối “catch”.
- Catch : lấy ra một ngoại lệ và tạo ra một đối tượng chứa thông tin ngoại lệ.
Cú pháp
1 2 3 4 5 6 7 8 9 | <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token comment">//Khối lệnh mà có thể phát sinh Exception</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//Khối lệnh bắt được Exception</span> <span class="token punctuation">}</span> |
Ví dụ :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token comment">//tạo hàm và throw một ngoại lệ</span> <span class="token keyword">function</span> <span class="token function">checkNum</span><span class="token punctuation">(</span><span class="token variable">$number</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token variable">$number</span> <span class="token operator">></span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span><span class="token double-quoted-string string">"Giá trị phải nhỏ hơn hoặc bằng 1."</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//kích hoạt ngoại lệ trong khối "try"</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token function">checkNum</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// nếu ngoại lệ được ném ra thì lệnh sau không được thực thi</span> <span class="token keyword">echo</span> <span class="token single-quoted-string string">'Number nhỏ hơn hoặc bằng 1.'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span><span class="token punctuation">(</span>Exception <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//catch exception</span> <span class="token keyword">echo</span> <span class="token single-quoted-string string">'Message: '</span> <span class="token punctuation">.</span><span class="token variable">$e</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token delimiter important">?></span></span> |
- Hàm checkNum() kiểm tra nếu một số lớn hơn 1. Nếu điều kiện đúng ngoại lệ được ném ra
- Hàm checkNum() được gọi trong khối “try”
- Ngoại lệ trong hàm checkNum() được ném ra
- Khối “catch” lấy ra ngoại lệ và tạo ra một đối tượng ($e) chứa thông tin ngoại lệ
- Thông báo lỗi từ ngoại lệ được lặp lại bằng cách gọi $ e-> getMessage() từ đối tượng ngoại lệ.
Trong ví dụ trên, hàm $e->getMessage được sử dụng để lấy error message. Dưới đây là một số hàm có thể được sử dụng từ lớp Exception trong PHP.
- getMessage() : Hiển thị tin nhắn ngoại lệ
- getCode() : Hiển thị các mã số là đại diện của các loại ngoại lệ.
- getFile() : Hiển thị tên các tập tin và đường dẫn nơi xảy ra ngoại lệ.
- getLine() : Hiển thị các dòng xảy ra ngoại lệ.
- getTrace() : Hiển thị trả về thông tin truy vết lỗi là một mảng các tên file và số dòng
- getPrevious() : Hiển thị các ngoại lệ trước khi xảy ra trường hợp hiện tại
- 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
__toString()
: Hiển thị toàn bộ ngoại lệ như một chuỗi.
2.1 Tạo một lớp ngoại lệ tùy chỉnh
Nếu lớp Exception mặc định chưa đủ dùng cho bạn, bạn có thể tạo ra các Exeption riêng bằng cách kế thừa lớp Exception
- Chú ý, chỉ có phương thức khởi tạo
__contruct()
và__toString
của Exception có thể ghi đè trong lớp kế thừa, còn lại các phương thức khác không thể ghi đè vì nó được định nghĩa là final.
Ví dụ :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">class</span> <span class="token class-name">CustomException</span> <span class="token keyword">extends</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">errorMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//error message</span> <span class="token variable">$errorMsg</span> <span class="token operator">=</span> <span class="token single-quoted-string string">'Error on line '</span><span class="token punctuation">.</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getLine</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token single-quoted-string string">' in '</span><span class="token punctuation">.</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getFile</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token single-quoted-string string">': <b>'</span><span class="token punctuation">.</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token single-quoted-string string">'</b> is not a valid E-Mail address'</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$errorMsg</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token variable">$email</span> <span class="token operator">=</span> <span class="token double-quoted-string string">"<a href="/cdn-cgi/l/email-protection" class="__cf_email__">[email protected]</a>"</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token comment">//check email hợp lệ</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">filter_var</span><span class="token punctuation">(</span><span class="token variable">$email</span><span class="token punctuation">,</span> <span class="token constant">FILTER_VALIDATE_EMAIL</span><span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token constant">FALSE</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//throw exception nếu email không hợp lệ</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">customException</span><span class="token punctuation">(</span><span class="token variable">$email</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">customException</span> <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//hiển thị message</span> <span class="token keyword">echo</span> <span class="token variable">$e</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">errorMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token delimiter important">?></span></span> |
2. 2) Xử lý 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.
Ví dụ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">class</span> <span class="token class-name">CustomException2</span> <span class="token keyword">extends</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">errorMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//error message</span> <span class="token variable">$errorMsg</span> <span class="token operator">=</span> <span class="token single-quoted-string string">'Error on line '</span><span class="token punctuation">.</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getLine</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token single-quoted-string string">' in '</span><span class="token punctuation">.</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getFile</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token single-quoted-string string">': <b>'</span><span class="token punctuation">.</span><span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token single-quoted-string string">'</b> is not a valid E-Mail address.'</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token variable">$errorMsg</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token variable">$email</span> <span class="token operator">=</span> <span class="token double-quoted-string string">"<a href="/cdn-cgi/l/email-protection" class="__cf_email__">[email protected]</a>"</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token comment">//check if</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">filter_var</span><span class="token punctuation">(</span><span class="token variable">$email</span><span class="token punctuation">,</span> <span class="token constant">FILTER_VALIDATE_EMAIL</span><span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token constant">FALSE</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//throw exception nếu email không hợp lệ</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">CustomException2</span><span class="token punctuation">(</span><span class="token variable">$email</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//kiểm tra tồn tại chuỗi "example" trong địa chỉ email</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">strpos</span><span class="token punctuation">(</span><span class="token variable">$email</span><span class="token punctuation">,</span> <span class="token double-quoted-string string">"example"</span><span class="token punctuation">)</span> <span class="token operator">!==</span> <span class="token constant">FALSE</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span><span class="token double-quoted-string string">"<span class="token interpolation"><span class="token variable">$email</span></span> is an example e-mail."</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">CustomException2</span> <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token variable">$e</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">errorMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span><span class="token punctuation">(</span>Exception <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">echo</span> <span class="token variable">$e</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token delimiter important">?></span></span> |
2.3) Thiết lập Xử lý ngoại lệ toàn cục
Khi ứng dụng phát sinh ngoại lệ bằng lệnh throw, nếu ngoại lệ không bị bắt lại bằng khối lệnh try … catch … thì ngoại lệ đó sẽ chuyển cho hàm xử lý ngoại lệ mặc định của PHP. Giờ nếu bạn muốn tạo ra hàm mặc định này thì làm như sau: Tạo hàm riêng xử lý ngoại lệ có dạng function my_exception_handler($exception), sau đó dùng hàm set_exception_handler(‘my_exception_handler’) để đăng ký với PHP
Ví dụ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">function</span> <span class="token function">handleUncaughtException</span><span class="token punctuation">(</span><span class="token variable">$e</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment">// Hiển thị thông báo lỗi chung cho người dùng</span> <span class="token keyword">echo</span> <span class="token double-quoted-string string">"Opps! Có lỗi xảy ra. Hãy thử lại hoặc liên hệ với chúng tôi nếu còn lỗi."</span><span class="token punctuation">;</span> <span class="token comment">// Lấy thông tin lỗi</span> <span class="token variable">$error</span> <span class="token operator">=</span> <span class="token double-quoted-string string">"Uncaught Exception: "</span> <span class="token punctuation">.</span> <span class="token variable">$message</span> <span class="token operator">=</span> <span class="token function">date</span><span class="token punctuation">(</span><span class="token double-quoted-string string">"Y-m-d H:i:s - "</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$error</span> <span class="token punctuation">.</span><span class="token operator">=</span> <span class="token variable">$e</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token double-quoted-string string">" trong file "</span> <span class="token punctuation">.</span> <span class="token variable">$e</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getFile</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token double-quoted-string string">" ở dòng "</span> <span class="token punctuation">.</span> <span class="token variable">$e</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getLine</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token double-quoted-string string">"n"</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// Đăng ký xử lý ngoại lệ tùy chỉnh</span> <span class="token function">set_exception_handler</span><span class="token punctuation">(</span><span class="token double-quoted-string string">"handleUncaughtException"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Ném ra một ngoại lệ</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span><span class="token double-quoted-string string">"Kiểm tra ngoại lệ!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span> |
Kết bài
Như vậy là trong bài này mình đã trình bày về xử lý lỗi và Exception trong PHP cám ơn tất cả mọi người đã theo dõi
Nguồn tham khảo