头图

【PHP入门系列】5-PHP错误异常以及调试

jyoz

可悲的是,不管我们在写代码时多么小心,BUG始终是有的。

错误

PHP 有几个错误严重性等级。三个最常见的的信息类型是错误(error)、通知(notice)和警告(warning)。它们有不同的严重性: E_ERROR 、E_NOTICE和 E_WARNING。错误是运行期间的严重问题,通常是因为代码出错而造成,必须要修正它,否则会使 PHP 停止执行。通知是建议性质的信息,是因为程序代码在执行期有可能造成问题,但程序不会停止。 警告是非致命错误,程序执行也不会因此而中止。

PHP 遇到一系列内部错误时,会报告出来作为应对 php.ini 中 error_reporting 的配置 或者是运行时调用 error_reporting() 控制了哪些错误需要报告,哪些错误需要自动忽略。

在开发环境里为了发现并修复 PHP 产生的问题, 应该总是把 error_reporting 设置为 E_ALL。 在生产环境里,用户可能为了降低信息的详细程度, 想要将它设置为类似 E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED, 但很多情况下 E_ALL 也同样适用,这样可以更早地警告潜在问题。

如果 PHP 默认错误处理器还不能满足要求,用户可以通过 set_error_handler() 设置自定义错误处理器,可处理很多类型的错误。

PHP7之后大多数错误被作为 Error 异常抛出。这种 Error 异常可以像 Exception 异常一样被第一个匹配的 try / catch 块所捕获。如果没有匹配的 catch 块,则调用异常处理函数(事先通过 set_exception_handler() 注册)进行处理。 如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(Fatal Error)。

异常

异常是许多流行编程语言的标配.PHP内部函数主要使用错误报告,只有一些现代面向对象的扩展使用异常。不过,错误很容易用 ErrorException 转化成异常。 然而,这个技术方案仅适用非 Fatal 级的错误,PHP 可以完美化身为「重异常」的程序语言,只需要几行代码就能切换过去。基本上你可以利用 ErrorException 类抛出「错误」来当做「异常」,这个类是继承自 Exception 类。

<?php
function exceptions_error_handler($severity, $message, $filename, $lineno) {
    throw new ErrorException($message, 0, $severity, $filename, $lineno);
}

set_error_handler('exceptions_error_handler');
?>

这在大量的现代框架中是一个常见的做法,比如 Symfony 和 Laravel。如果开启调试模式,或者进入开发环境的话,这两个框架都会将显示美观清晰的 调用栈。

在开发过程中将错误当作异常抛出可以更好的处理它,如果在开发时发生异常,你可以将它包在一个 catch 语句中具体说明这种情况如何处理。每捕捉一个异常,都会使你的应用程序越来越健壮。

<?php
//处理结构
try {
  
} catch (Exception $e) {
  
} finally {
  
}

调试

合适的调试器是软件开发中最有用的工具之一,它使你可以跟踪程序执行结果并监视程序堆栈中的信息。

最简单的办法是使用 var_dump()/print_r() 调错,根据报错打印输出一步步调试。不过这种办法对于一些复制的问题,可能比较吃力。这时候可能需要借助调试器。

XDEBUG
Xdebug是一个PHP的调试器,它可以被用来在很多IDE(集成开发环境)中做断点调试以及堆栈检查。它还可以像 PHPUnit 和 KCacheGrind 一样,做代码覆盖检查或者程序性能跟踪。

XDEBUG官网地址

xdebug+phpstorm+chrome

一、PHP安装xdebug扩展配置

先安装php-xdebug(简单略过).后修改xdebug配置如下:

#扩展位置,不更改
zend_extension="/usr/local/opt/php71-xdebug/xdebug.so" 
#新增配置

#允许远程调试
xdebug.remote_enable = 1
#远程所在HOST和PORT
xdebug.remote_host= localhost
xdebug.remote_connect_back = 1
#远程配置都是默认,只修改port默认是9000,这里修改为9001,php-fpm运行占用9000端口。
xdebug.remote_port = 9001
xdebug.max_nesting_level = 512

#可以是任意Key,这里设定为PHPSTORM,此KEY和后面IDE以及浏览器配置保持一致
xdebug.idekey="PHPSTORM"
xdebug.default_enable=on
二、phpstorm 配置
  • phpstorm设置-->languages and frameworks --> php 找到php的设置 选择好php level 和 interpreter (环境的php版本和 php cli路径)
  • php配置下面的servers: 新增项目的域名配置debugger选择xdebug
  • php配置下面的debug: 勾选xdebug下面所有选项,xdebug端口修改为9001 和安装xdebug的配置xdebug.remote_port端口保持一致
  • php配置下的debug下面的DBGp Proxy配置项: IDEKEY和安装xdebug的配置xdebug.idekey保持一致 ,host项目的域名,port项目的端口
  • 保存配置后,进入工具栏的RUN ,选择 Edit configurations, 新增config 选择 php web application, server选择刚php配置的server,browser选择chrome
三、 chrome 安装配置
  • 安装Xdebug helper 扩展
  • IDE key 选择 phpstorm,填写PHPSTORM,和xdebug.idekey保持一致
四、 所有配置完成,IDE中打断点,运行debug即可
阅读 414

不积跬步无以至千里

1 声望
0 粉丝
0 条评论

不积跬步无以至千里

1 声望
0 粉丝
文章目录
宣传栏