Detailed introduction to handling exception errors in PHP

王林
Release: 2023-04-07 09:06:02
forward
2010 people have browsed it

1. Error reporting level error_reporting()

error_reporting(int $level);
Copy after login

PHP 5.4 and above E_ALL includes E_STRICT.

PHP Manual All error levels.

Example:

<?php

// 关闭所有PHP错误报告
error_reporting(0);

// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// 报告 E_NOTICE也挺好 (报告未初始化的变量
// 或者捕获变量名的错误拼写)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// 除了 E_NOTICE,报告其他所有错误
error_reporting(E_ALL ^ E_NOTICE);

// 报告所有 PHP 错误 (参见 changelog)
error_reporting(E_ALL);

// 报告所有 PHP 错误
error_reporting(-1);

// 和 error_reporting(E_ALL); 一样
ini_set(&#39;error_reporting&#39;, E_ALL);

?>
Copy after login

2. Error handling function set_error_handler()

set_error_handler(function (int $errno, string $errstr, string $errfile, int $errline) {
    // ...
}, $error_types = E_ALL)
Copy after login

specified by the above $error_types The error type will be intercepted by the error handling function (unless the function returns false)

When an error occurs in a statement prefixed with @, the $errno value is 0

The script will continue to execute after the processing function ends (so you need to actively call die() if necessary)

Example:

function handleError($level, $message, $file = &#39;&#39;, $line = 0)
{
    if (error_reporting() & $level) {
        throw new ErrorException($message, 0, $level, $file, $line);
    }
    return false;
}
Copy after login

Convert Error Exception

Note: Uncatchable Error

The following level errors cannot be user-defined Function to process:

E_ERROR

<strong>##E_PARSE<span style="font-size: 14px;"></span></strong>

<strong>E_CORE_ERROR<span style="font-size: 14px;"></span></strong>

##E_CORE_WARNING<strong><span style="font-size: 14px;"></span></strong> <strong><span style="font-size: 14px;"></span></strong>

##E_COMPILE_ERROR<strong><span style="font-size: 14px;"></span></strong>

##E_COMPILE_WARNING

<strong><span style="font-size: 14px;"></span></strong>Most E_STRICT generated in the file where the

set_error_handler()

function is called. These uncaught errors can be handled in register_shutdown_function() (but the script will still end)

3. 异常处理函数 set_exception_handler

// < PHP 7
set_exception_handler(&#39;handleException&#39;)


// < PHP 7
handleException(Exception $ex)
{
    echo "Uncaught exception: " , $ex->getMessage(), "\n";
}


// >= PHP 7
handleException(Throwable $ex)
{
    echo "Uncaught exception: " , $ex->getMessage(), "\n";
}
Copy after login

<span style="font-size: 14px;"></span>

在用户自定义异常处理函数内部, 可根据情况做一下处理:

日志记录错误

web 渲染错误页面

console 渲染错误提示

<span style="font-size: 14px;"></span>

4. PHP 中止时执行函数

<span style="font-size: 14px;">register_shutdown_function</span>

register_shutdown_function(function () {

}, $para1, $param2, ...)
Copy after login

在用户自定义脚本中止处理函数内部, 可根据情况做一下处理:

判断是否因严重错误而结束脚本(无法被 set_error_handler 捕获的错误中止脚本)

register_shutdown_function(&#39;handleShutdown&#39;)

function handleShutdown()
{
if (! is_null($error = error_get_last()) && isFatal($error[&#39;type&#39;])) {
      // handleException() 函数同时处理 set_exception_handler
      handleException(new \ErrorException(
        $error[&#39;message&#39;], $error[&#39;type&#39;], 0, $error[&#39;file&#39;], $error[&#39;line&#39;],
      ));
  }
}

function isFatal($type)
{
  return in_array($type, [E_COMPILE_ERROR, E_CORE_ERROR, E_ERROR, E_PARSE]);
}
Copy after login

<span style="font-size: 14px;"></span>

以下错误无法被 set_error_handler 捕获

E_ERROR

E_PARSE

E_CORE_ERROR

E_CORE_WARNING

E_COMPILE_ERROR

E_COMPILE_WARNING

若因为错误而结束脚本, 若是严重错误则可将其转为 异常类, 并由异常处理函数统一处理.

Note:

多次调用 register_shutdown_function 时不会互相覆盖, 而是会按照注册顺序被依次调用.

除非在某个注册的方法内部调用 exit()

Note:

进程被信号 SIGTERMSIGKILL 杀死时中止函数不会被调用. 可通过 pcntl_signal 捕获信号, 再在其中调用 exit() 来进行正常中止。

以上就是关于错误异常的处理,如有错误请指出。不胜感激!

更多相关问题请访问PHP中文网:PHP视频教程


<span style="font-size: 14px;"></span>

The above is the detailed content of Detailed introduction to handling exception errors in PHP. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:csdn.net
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template