前言

PHP提供了错误处理和日志记录的功能. 这些函数允许你定义自己的错误处理规则,以及修改错误记录的方式. 这样,你就可以根据自己的需要,来更改和加强错误输出信息以满足实际需要。

通过日志记录功能,你可以将信息直接发送到其他日志服务器,或者发送到指定的电子邮箱(或者通过邮件网关发送),或者发送到操作系统日志等,从而可以有选择的记录和监视你的应用程序和网站的最重要的部分。

错误报告功能允许你自定义错误反馈的级别和类型,可以是简单的提示信息或者使用自定义的函数进行处理并返回信息。

error

不能在编译期发现的运行期错误,不如试图用 echo 输出一个未赋值的变量,这类问题往往导致程序或逻辑无法继续下去而需要中断;

exception

程序执行过程中出现意料之外的情况,逻辑上往往是行得通的,但不符合应用场景,比如接收到一个长度超出预定格式的用户命名,因此,异常主要靠编码人员做预先做判断后抛出,捕获异常后改变程序流程来处理这些情况,不必中断程序。

参考文献

PHP官方文档:https://www.php.net/manual/zh/book.errorfunc.php

Exception预定义异常:https://www.php.net/manual/zh/class.exception.php

错误处理函数:https://www.php.net/manual/zh/ref.errorfunc.php

示例演示

try-catch

try-catch捕获异常

<?php
try {
	throw new Exception('an error'); // 抛出异常
	// you codes that maybe cause an error
}catch(\Exception $e){ // 这个错误对象需要声明类型, Exception 是系统默认异常处理类
	echo $e->getMessage().PHP_EOL;
	var_dump($e->getCode());
}

// 输出
//an error int(0)

try-catch扩展catch子句

<?php
// ErrorException:用set_error_handler()函数将错误信息托管至ErrorException。是 PHP 5 增加的异常类以便将错误封装为异常,可以更好地处理错误信息,继承于 Exception。

// 自定义错误类
class MyException extends Exception{
   public $errType = 'default';
   public function __construct($errType=''){
      $this->errType = $errType;
  }
}

// 测试实例
try{  // you codes that maybe cause an error
   throw new MyException('My an error');
}catch(MyException $err){ // 这个错误对象需要声明类型 
   echo $err->errType.PHP_EOL; 
}catch(ErrorException $e){
   echo 'error !'.$e->getMessage().PHP_EOL; 
}catch(Exception $e){
   echo $e->getMessage().PHP_EOL;
}

// 输出
// My an error

Exception异常的回调函数

error_log

error_log() 函数向服务器错误记录、文件或远程目标发送一个错误。如果成功该函数返回 TRUE,如果失败该函数返回 FALSE。

<?php
$test=2;
if ($test>1) {
	error_log("触发自定义错误",1,"someone@example.com","From: webmaster@example.com");
}

set_error_handler 自定义错误处理函数

该函数用于创建运行期间的用户自己的错误处理方法。该函数返回旧的错误处理程序,如果失败则返回 NULL

<?php
//error handler function
function customError($errno, $errstr, $errfile, $errline)
{
	echo "<b>Custom error:</b> [$errno] $errstr<br />";
	echo " Error on line 错误行数 $errline in $errfile<br />";
	echo "Ending Script";
	die();
}

//set error handler
set_error_handler("customError");

$test=2;

//trigger error
if ($test>1) {
	trigger_error("出发自定义错误");
}

/*
输出
Custom error: [1024] 出发自定义错误
Error on line 错误行数 18 in F:\www\aaa.php
Ending Script
*/

set_exception_handler 自定义异常处理函数

该函数用于创建运行期间的用户自己的异常处理方法。该函数返回旧的异常处理程序,如果失败则返回 NULL。

<?php
function myException($exception) {
	echo "<b>Exception:</b> " , $exception->getMessage();
}
set_exception_handler('myException');
throw new Exception('自定义异常处理返回');

/*
返回:
Exception: 自定义异常处理返回
*/

error_get_last 获得最后发生的错误

该函数以数组的形式返回最后发生的错误。如果没有错误发生则返回 NULL

<?php
echo $test + $abc;
print_r(error_get_last());

/*
输出
Array ( [type] => 8 [message] => Undefined variable: abc [file] => F:\www\aaa.php [line] => 2 )
*/

register_shutdown_function 注册一个会在php中止时执行的函数

注册一个 callback ,它会在脚本执行完成或者 exit() 后被调用。

<?php
function shutdown()
{
    // This is our shutdown function, in 
    // here we can do any last operations
    // before the script is complete.
    echo 'Script executed with success', PHP_EOL;
}

register_shutdown_function('shutdown');