Hello everyone, this article I present about error handling and Exception in PHP, I am looking forward to your follow up.
1) Error handling
Error handling is the process of detecting errors generated when running your code and then performing the appropriate actions. If you handle the error incorrectly, it can lead to many unexpected results.
PHP provides mechanisms to help catch errors, monitor errors and handle errors that may occur when programming.
1.1) The die () and exit () functions
- To catch errors in PHP we can use the die () or exit () functions.
- When using die () or exit () functions, a message will be fired and the program will be stopped.
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) Self-defining functions to handle errors in PHP
- To define the function itself to handle errors, you can use the syntax:
error_function(errno, errstr, errfile, errline, errcontext);
- The custom error handling function must have at least two required parameters (error_level and errstr), plus it has three additional parameters (errfile, errline and errcontext) that are not required, as described below.
- errno: Determines the degree of error, as an integer. This corresponds to the appropriate error level constant (E_ERROR, E_WARNING, …)
- errstr: Identify the error message as a string
- errfile: Specifies the file name of the script in which an error occurred
- errline: Determine the number of lines that an error occurs
- errcontext: Defines an array containing all variables and their values to exist at the time of the error. This parameter is very useful for debugging
- Error levels in PHP
Error level | Value | Describe |
---|---|---|
E_ERROR | first | A serious Runtime error. The script execution is stopped immediately |
E_WARNING | 2 | Non-fatal errors and script execution are not stopped |
E_NOTICE | 8 | A runtime notification. Indicates that the script encountered an error that may occur, although the situation may also occur when running the script normally |
E_USER_ERROR | 256 | An error message generated by the user. This is like an E_ERROR, except that it is created by a PHP script using the trigger_error () function rather than the PHP engine. |
E_USER_WARNING | 512 | A non-fatal user generated warning message. This is like an E_WARNING, except that it is created by a PHP script using the trigger_error () function, not the PHP engine. |
E_USER_NOTICE | 1024 | A user-generated notification notification This is like an E_NOTICE, except that it is created by a PHP script using the trigger_error () function rather than the PHP engine. |
E_STRIC | 2048 | Not entirely an error, but triggered whenever PHP encounters code that can lead to incompatibility issues or transitions. |
E_ALL | 8189 | All errors and warnings, except for E_STRICT before PHP 5.4.0. |
For example
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> |
Thus, we customize the error message message to be more friendly and clear.
2) Exception
- Exception is an object-oriented error management solution
- It is a class built into the PHP language
- An Exception object will contain information about where the error occurred (file name, line number)
- Some keywords related to Exception
- Try: the code with the exception of the try block is an exception. If no exceptions occur, the code will continue as usual. However, if an exception occurs, an exception will be thrown.
- Throw: Exception is triggered. Each “throw” must include at least one “catch” block.
- Catch: retrieve an exception and create an object containing exception information.
Syntax
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> |
For example :
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> |
- The checkNum () function checks if a number is greater than 1. If an exception condition is thrown
- The checkNum () function is called in a “try” block.
- Exception in checkNum () function is thrown
- The “catch” block retrieves the exception and creates an object ($ e) containing the exception information
- The error message from the exception is repeated by calling $ e-> getMessage () from the exception object.
In the above example, the $ e-> getMessage function is used to get the error message. Here are some functions that can be used from Exception class in PHP.
- getMessage (): Show an exception message
- getCode (): Displays codes that are representative of exception types.
- getFile (): Display the file name and path where the exception occurred.
- getLine (): Displays the exception exception line.
- getTrace (): Display returns error tracking information as an array of file names and line numbers
- getPrevious (): Displays the exception before the current case occurs
- getTraceAsString (): Displays a series of exceptions as a string instead of an array
__toString()
: Display all exceptions as a string.
2.1 Create a custom exception class If the default Exception class is not enough for you, you can create your own exceptions by extending the Exception class.
- Note that only the Exception’s
__contruct()
and__toString
can override in the derived class, the rest cannot override because it is defined as final.
For example :
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 class="__cf_email__" href="/cdn-cgi/l/email-protection">[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) Handling many exceptions
- Multiple Exceptions use multiple try … catch blocks to try to catch thrown exceptions.
For example
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 class="__cf_email__" href="/cdn-cgi/l/email-protection">[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) Setting Global Exception Handling When an application generates an exception with a throw command, if the exception is not caught by the try … catch … block, the exception will pass to the foreign handler function PHP default rules. Now if you want to create this default function, do the following: Create your own exception handling function of the form my_exception_handler ($ exception), then use set_exception_handler (‘my_exception_handler’) to register with PHP
For example
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> |
End
So in this article I have presented about error handling and Exception in PHP thank you everyone for watching
Reference source