Home  >  Article  >  Backend Development  >  Analyze PHP error handling (core feature)

Analyze PHP error handling (core feature)

藏色散人
藏色散人forward
2020-01-26 13:35:402103browse

Analyze PHP error handling (core feature)

Errors and exceptions

Errors can understand errors in the program itself, such as syntax errors. Exceptions tend to be when the program does not run as expected or does not conform to the normal process; for the PHP language, the mechanisms used to handle errors and exceptions are completely different, so it is easy to cause confusion.

For example, we want to handle the division by 0 situation by catching the exception, but before the exception is caught, PHP triggers an error.

try {
    $a = 5 / 0;
} catch (Exception $e) {
    $e->getMessage();
    $a = -1;  // 通过异常来处理 $a 为 0 的情况,但是实际上,捕获不到该异常
}

echo $a;
// PHP Warning:  Division by zero

That is to say, PHP will trigger the situation when the divisor is 0 as an error, and will not automatically throw an exception, so it cannot be caught. Similarly, in many cases, PHP cannot automatically throw exceptions. Exceptions can only be thrown manually through if-else statements and combined with the throw method.

The above situation occurs mainly because the exception mechanism is the product of PHP's evolution to object-oriented. Prior to this, PHP's error reporting was mainly through the error mechanism. Therefore, in many cases, PHP errors are more valuable than exceptions. However, PHP7 begins to unify the two, allowing errors to be thrown like exceptions (this part will be explained in the exceptions section).

Error level

Errors in PHP can be understood as abnormal situations that prevent the script from running properly. They can be determined from high to low according to the error level. Divided into five categories

1.Parse error or Syntax Error - syntax parsing error, after triggering this error, the script cannot run at all;

2.Fatal Error - Fatal error. After this error is triggered, subsequent scripts cannot continue to execute;

3.Warning Error - An inappropriate place appears. The script can continue to execute;

4.Notice Error - Something inappropriate has occurred, but the degree is lower than a Warning Error, the script can continue to execute;

5.Deprecated Error - This use is not recommended and may be abandoned in the future. The script can continue to execute;

By default, PHP triggers an error and displays the error level and corresponding prompt.

Parse Error Example - No semicolon at the end of the statement

 echo "abc"
// PHP Parse error:  syntax error, unexpected end of file, expecting ',' or ';

Fatal ErrorExample - Using a non-existent function

 echo "before\n";
 foo();
 echo "after"; // 本行无法继续执行
 // before
 // PHP Fatal error:  Uncaught Error: Call to undefined function foo()

Warning Error Example - Introducing non-existent file

$a = "foo";
include('bar.php');
echo $a; // 程序继续执行
// PHP Warning:  include(bar.php): failed to open stream: No such file or directory ...
// foo
Notice Error 示例 - 输出不存在的变量

echo $foo;
echo 12345;
// PHP Notice:  Undefined variable: foo
// 12345

Deprecated Error Example - In some string functions Pass in numbers instead of strings

 strpos('12345', 3);
 // PHP Deprecated:  strpos(): Non-string needles will be interpreted as strings in the future

In addition to the default trigger message, users can also use the set_error_handler function to customize error handling. Most error types can be customized, except Except for E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING .

 set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed

Example

<?php
// E_ALL - 处理全部错误类型
set_error_handler(&#39;customError&#39;, E_ALL);

/**
 * @param  int $errno 错误的级别
 * @param  string $errstr  错误的信息
 * @param  string $errfile 错误的文件名(可选)
 * @param  string $errline 错误发生的行号(可选)
 */
function customError(int $errno, string $errstr, string $errfile, string $errline)
{
    echo sprintf(&#39;错误消息为 %s&#39;, $errstr);
}

$a = 5 / 0;  // 错误消息为 Division by zero

Users can also manually trigger a user-level error (E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE, E_USER_DEPRECATED) through the trigger_error function .

function division($a, $b) {
    if($b == 0){
        @trigger_error("0 不能作为除数", E_USER_NOTICE);
        return -1;
    }
    return $a / $b;
}

echo division(10, 0);

Error-related configuration

Some common configuration related to error handling

error_reporting - Set the error reporting level

display_errors - Whether to display errors

display_startup_error - Whether to display PHP startup Display during the process

log_errors -Set whether to record the error information of the script running to the server error log or error_log

"Modern PHP" proposes four Rules

● Be sure to let PHP report errors;

● Errors must be displayed in the development environment;

● Errors must not be displayed in the production environment;

● Errors must be recorded in both the development environment and the production environment;

Recommended configuration for the development environment

 display_errors = On
 display_startup_error = On
 error_reporting = -1
 log_errors = On

Recommended configuration for the production environment

display_errors = Off
display_startup_error = Off
; 报告 Notice 以外的所有错误
error_reporting = E_ALL & ~E_NOTICE
log_errors = On

Symfony encoding specification related

Exception and error message strings must be spliced ​​using sprintf ;

throw new CommandNotFoundException(sprintf('Command "%s" does not exist.', $name));

When the error type is E_USER_DEPRECATED, you need to add@

@trigger_error("foo", E_USER_DEPRECATED);

For more related php knowledge, please visit php tutorial!

The above is the detailed content of Analyze PHP error handling (core feature). For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:cnblogs.com. If there is any infringement, please contact admin@php.cn delete