php的错误处理函数怎么用

发布时间:2022-03-18 15:37:12 作者:iii
来源:亿速云 阅读:117

这篇文章主要介绍了php的错误处理函数怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇php的错误处理函数怎么用文章都会有所收获,下面我们一起来看看吧。

set_error_handler()

首先是大家可能会接触过的一个函数,它可以用来捕获一些错误的信息。如果我们需要统一处理一些错误,比如规定日志格式或者将错误信息发送到邮件中,一般会在入口文件的开头在全局范围内定义一个这个函数进行统一的处理。

echo $a; // Notice: Undefined variable: a ...
//  E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING 不能处理
set_error_handler(function($errno, $errstr, $errfile, $errline){
    echo "Has Error:", $errno, ',', $errstr, ',', $errfile, ',', $errline, PHP_EOL; 
}, E_ALL | E_STRICT);

echo $a; // Has Error:8,Undefined variable: a ...

set_error_handler() 函数接收一个回调函数和一个错误接收的类型,它的函数签名是:

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

$error_handler是一个回调(匿名)函数,这个函数内部可以获取到错误的等级、信息、文件、行数等

handler ( int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] ) : bool
 

其中,$errcontext 已经在 PHP7.2 之后取消了。

\$error_types,用于错误接收的类型,就像 error_reporting() 函数定义的错误类型一样,它用于控制 $error_handler 回调函数所能接收的错误的类型。

需要注意的是,这个函数无法处理 E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING 这些类型的错误,也就是说,能够中断程序执行的错误它都无法捕获处理。

另外,在函数调用之前的错误是无法捕获到的,只有在函数调用之后的错误才能通过这个函数进行捕获处理。 

restore_error_handler()

这个函数是用于还原之前的错误处理函数。比如我们在上面代码下添加这个函数,然后再次触发错误,错误将会使用回 PHP 的标准处理程序。

restore_error_handler();

echo $a; // Notice: Undefined variable: a ...
   

set_exception_handler()

学习了上面错误处理的函数后,从名称就可以看出,这个函数是用来处理异常的,它可以在全局范围内捕获异常。

set_exception_handler(function($ex){
    echo "Has Exception: " , $ex->getMessage(), PHP_EOL;
});

throw new Exception('Init Error');
 

它的函数签名是:

set_exception_handler ( callable $exception_handler ) : callable 

只接收一个回调函数,回调函数中只有一个参数,是一个 Exception 类型的参数内容,就和 try...catch 中的 catch 块的参数一样。在 PHP7 以后接收到的是一个 Throwable 类型的参数。也就是说,它可以捕获到所有的错误和异常。

不过需要注意的是,在 PHP 中,所有的异常如果不进行处理,都会以中止脚本的错误形式返回报错信息。所以,在 set_exception_handler() 内处理完之后,脚本会中止运行。即使后面还有代码。所以,这个函数一般会用于全局捕获一些异常、错误后进行日志记录,它不具有 try...catch 的能力,让异常处理完成后还能继续进行其他操作。 

restore_exception_handler()

同样的,异常捕获也是可以进行回退的。

set_exception_handler(function($ex){
    echo "Has Exception First: " , $ex->getMessage(), PHP_EOL;
});
set_exception_handler(function($ex){
    echo "Has Exception Second: " , $ex->getMessage(), PHP_EOL;
});

restore_exception_handler();

throw new Exception('Init Error Next'); // Has Exception First: Init Error Next
 

我们定义了两个 set_exception_handler() 函数,当使用 restore_exception_handler() 后,抛出的异常将会进入到第一个 set_exception_handler() 函数中进行处理。同理,restore_error_handler() 函数如果定义了多个错误处理,使用 restore_error_handler() 后也会一级一级回退,直到最终使用 PHP 的错误处理流程进行处理。 

trigger_error()

最后,我们来看看如何手动抛出一个错误。就像上面例子中的 throw new Exception() 一样,PHP 也提供了一个用户自定义手动抛出错误的函数。

trigger_error("I'm Error One!"); // Notice: I'm Error One!  

它的函数签名是:

trigger_error ( string $error_msg [, int $error_type = E_USER_NOTICE ] ) : bool

$error_msg,也就是这个错误的具体信息,长度限制为 1024 个字节,如果超过了这个长度就会被截断。另外,如果这个信息中包含 HTML 实体标签的话,也不会直接转义,在网页显示时需要使用 htmlentities() 来进行处理。

$error_type参数则是指定报错的级别,默认是 E_USER_NOTICE ,而且它只支持 E_USER... 相关的错误信息。也就是说,它的参数只能填三个 E_USER_NOTICE 、 E_USER_WARNING 、 E_USER_ERROR 。

当然,我们手动抛出的错误信息也是可以通过 set_error_handler() 进行捕获的。

set_error_handler(function($errno, $errstr, $errfile, $errline){
    echo "Has Error:", $errno, ',', $errstr, ',', $errfile, ',', $errline, PHP_EOL; 
}, E_ALL | E_STRICT);
trigger_error("I'm Error One!"); // Has Error:1024,I'm Error One!,...
trigger_error("I'm Error Two!", E_USER_WARNING); // Has 512,I'm Error One!,...
trigger_error("I'm Error Three!", E_USER_ERROR); // Has 256,I'm Error One!,...

trigger_error("I'm Error Four!", E_WARNING); // Has Error:2,Invalid error type specified,...

最后一个 trigger_error() 我们使用了 E_WARNING 类型,可以看出直接返回的内容是 指定的错误类型无效 ,而不是我们定义的内容。也就是说,这里是这个函数的参数类型错误的报错,不是我们手动想抛出的错误了。

关于“php的错误处理函数怎么用”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“php的错误处理函数怎么用”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. PHP之错误处理
  2. 更好的PHP错误处理

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php

上一篇:PHP中的错误处理函数有哪些

下一篇:C语言中函数使用的注意事项有哪些

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》