PHP错误以及异常处理
以前一直觉得php的异常处理没有什么,现在才发现这个还真是门学问,于是狠下心来好好研究了一下,写一篇文章,也作备忘吧。
1. php错误
无论是什么语言编程,都会有如下三种错误,当然php也不例外。
*语法错误 比如函数少括号、一条语句少分号等;
*运行时错误 这类错误比较多,像调用没有定义的函数错误、连接数据库、连接redis错误等等;
*逻辑错误 一般由于程序员导致,代码运行正常,但是达不到想要(输出)的效果。
2. 错误报告级别和设置
php的错误报告常量百度到处都有,在这里就不介绍了,这里主要讲讲错误报告的设置。不过以下两点值得注意:
*php5.4版本以后 E_STRICT 成为 E_ALL 的一部分(E_STRICT 的意义是报告不赞成的用法或不推荐的行为)
*我们经常会看到这样的的语句设置:E_ALL & ~E_NOTICE 这个意思所有错误和非通知类的错误,简单点就是除了通知外的所有错误(以前一直不知道这是什么鸟意思,真是丢脸)
我们可以通过php.ini文件或在每个脚本中进行错误报告设置。通过修改php.ini文件设置如下:
错误的主要设置其实就是这四个,接下来依次解释
*报告除了 php弃用的函数、变量等和不推荐的行为外的所有错误
*是否将错误以HTML形式输出到标准输出接口(一般是浏览器)
*是否将错误信息记录日志
*是否追踪错误,这个参数其实我也不太清楚有什么用途,手册上这样说:开发环境开启有利于帮助解决错误,线上无论如何都不能是开启状态。
3. 错误和异常处理
在 PHP 中,默认的错误处理很简单。一条消息会被发送到浏览器,这条消息带有文件名、行号以及一条描述错误的信息(前提是display_error 处于开启状态)。
一般线上环境中,display_error都是出于关闭状态的,这样如果不做异常的捕获处理,浏览器上是看不到错误信息的(当然了可以到错误日志中查看)。在PHP中,异常是必须手动抛出的。
例如下面这种状况(前提是:error_reporting=E_ALL; display_error=Off,error_logs=On):
浏览器上毛都不会打印出来,因为try中没有错误抛出,catch代码块就不会被执行。以前一直懊恼,这个怎么就打印不出来了那,现在想想也是心醉。
异常处理当然少不了try....catch. 上一张贴图中也有出现。正确的方式应该是这样的
这样当函数melody不存在时,throw语句抛出的错误就会被catch代码块捕获,也就会执行var_dump()。对于不同类型的异常,使用多个catch代码块进行处理在这里就不赘述了。
那我们无论写什么代码都要try ... throw ... catch, 这样不是太坑了。这就是set_error_handler()函数的用途了,当用户级别的错误、警告、通知发生时,set_error_handler()可提供一个调用函数,将用作错误处理的函数作为set_error_handler()的参数。举个例子:
终于搞定了,太高兴了。如果你想在报错后不再向下执行,可以在myErrorHandler中exit()掉。不过下面这种情况就傻眼了:
这种情况下浏览器还是什么都没有抛出,于是要看下日志。
Fatal Error 致命错误,函数set_error_handler()设置的函数并不能捕获致命错误。这样怎么搞,果断找google,果然有(应该是必然有,要不然php也太菜了),就是函数register_shutdown_function()。那接着上代码:
普通错误程序会继续向下执行,致命错误会立即终止执行。
4. Yaf框架的错误和异常处理
因为一直用到的都是Yaf框架,所以这里也讲一讲Yaf的错误和异常处理。Yaf抛出的错误会统一流到controller\Error.php中处理,举个例子:
出错地方(在modules目录下)
自定义处理函数,并将错误抛出(在library目录下)
错误捕捉(在controller目录下)
浏览器打印
由于框架比较复杂,很难把所有流程讲清楚,不过我相信熟悉Yaf框架的人都可以理解。当然致命错误是没有办法抛出的,我们是通过日志记录。
5. 杂项
*关于任务执行抛错可以用try...catch捕捉,来防止代码抛错后终止执行。
*throw $e 和 throw new Exception($e)区别,第一个$e 必须是php Exception类 衍生的错误;第二个$e 一般为字符串;
注:可能有理解错误的地方,而且还有些地方搞不太懂,以后会修改添加。
PHP错误以及异常处理的更多相关文章
- Yii中的错误及异常处理
Yii中的错误及异常处理 Yii已经默认已经在CApplication上实现了异常和错误的接管,这是通过php的set_exception_handler, set_error_handler实现的. ...
- 再谈PHP错误与异常处理
博客好久没有更新了,实在惭愧,最近在忙人生大事,哈哈!这段时间没有看什么新的东西,结合项目中遇到的PHP异常处理问题,我又重新梳理了之前模糊的概念,希望对大家理解PHP异常处理有所帮助. 请一定要注意 ...
- Golang错误和异常处理的正确姿势
Golang错误和异常处理的正确姿势 错误和异常是两个不同的概念,非常容易混淆.很多程序员习惯将一切非正常情况都看做错误,而不区分错误和异常,即使程序中可能有异常抛出,也将异常及时捕获并转换成错误.从 ...
- 【PHP】解析PHP中的错误和异常处理
目录结构: contents structure [-] 错误级别 自定义处理器 设置异常日志 自定义异常类 在这篇文章中,笔者将会阐述PHP中的异常处理,希望能够对你有所帮助. 1.错误级别 PHP ...
- ThinkPHP5.0源码学习之注册错误和异常处理机制
在base.php文件中,用一句代码\think\Error::register();实现错误和异常处理机制的注册. // 注册错误和异常处理机制 \think\Error::register(); ...
- 2018/05/02 PHP 之错误与异常处理
在学习中,越学习越觉得自己基础薄弱. 在平常工作中,对于某些错误处理感觉不知道怎么下手,于是决定重新再整理一下. 强烈推荐这篇文章,真的感觉学习到了很多. 部分引用::再谈PHP错误与异常处理 -- ...
- PHP 注册错误和异常处理机制
注册错误和异常处理机制有三个PHP函数需要学习 1. register_shutdown_function('Bootstrap\Library\Frame::fatalError'); 2. set ...
- PHP常用功能块_错误和异常处理 — php(32)
一.错误和异常处理 1.1 错误类型和基本的调试方法PHP程序的错误发生一般归属于下列三个领域: 语法错误:语法错误最常见,并且也容易修复.如:代码中遗漏一个分号.这类错误会阻止脚本的执行. 运行时错 ...
- php 错误和异常处理
一.错误和异常处理 1.1 错误类型和基本的调试方法 PHP程序的错误发生一般归属于下列三个领域: 语法错误: 语法错误最常见,并且也容易修复.如:代码中遗漏一个分号.这类错误会阻止脚本的执行. 运行 ...
随机推荐
- BZOJ 1212: [HNOI2004]L语言 [AC自动机 DP]
1212: [HNOI2004]L语言 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1367 Solved: 598[Submit][Status ...
- Java程序设计之链表结构
唉,说点废话,昨天偶尔看到一年前自己用C解约瑟夫环问题的循环链表,唏嘘不已,想想自己一年前嵌入式的梦呢,这两天发生了许多,而有些人不在了就真的不在了,心情不好,不多说了,直接上代码,只是些链表的基本操 ...
- 【C#】调度程序进程已挂起,但消息仍在处理中;
环境:WPF.弹窗,messageBox.show();错误信息:调度程序进程已挂起,但消息仍在处理中:解决方法:Dispatcher.BeginInvoke(new Action(()=>{ ...
- Bootstap datetimepicker报错TypeError: intermediate value
Bootstrap datetimepicker有多个版本,官方的链接中,只是datepicker,没有时间的选择,原版的datetimepicker也不再更新,不能用新版的jquery.现在http ...
- 如何使用PullToRefresh
这里有详解 PullToRefresh使用详解(一)--构建下拉刷新的listView PullToRefresh使用详解(二)---重写BaseAdapter实现复杂XML下拉刷新 PullToRe ...
- 练习JavaScript实现过滤特殊字符
for循环遍历特殊字符和用户输入字符,然后做比较,返回结果. <script type="text/javascript"> var name = prompt(&qu ...
- java中关键字volatile的作用
用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B.只在某些动作时才进行A和B的同步.因此存在A和B不一致的情况.volatile就是用来 ...
- BZOJ 2039: [2009国家集训队]employ人员雇佣
2039: [2009国家集训队]employ人员雇佣 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 1369 Solved: 667[Submit ...
- OI省选算法汇总
copy from hzwer @http://hzwer.com/1234.html 侵删 1.1 基本数据结构 1. 数组 2. 链表,双向链表 3. 队列,单调队列,双端队列 4. 栈,单调栈 ...
- 5分钟部署ELK+filebeat5.1.1
标题有点噱头,不过网络环境好的情况下也差不多了^_^ 1. 首先保证安装了jdk. elasticsearch, logstash, kibana,filebeat都可以通过yum安装,这里前 ...