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程序的错误发生一般归属于下列三个领域: 语法错误: 语法错误最常见,并且也容易修复.如:代码中遗漏一个分号.这类错误会阻止脚本的执行. 运行 ...
随机推荐
- C#中ToString()格式详解
以下内容均摘自博客园,仅供资料查询. ToString格式化 在很多对象显示为字符串的时候都会使用到ToString中的格式化,由于以前没怎么注意到这个问题,想总结一下各个基础结构对象的格式化,以便后 ...
- MVC+EF6+Oracle,提示ORA-01918: user '***' does not exist
1.在上下文里重载OnModelCreating: //没用到这个方法 protected override void OnModelCreating(DbModelBu ...
- [LeetCode] Longest Increasing Subsequence 最长递增子序列
Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...
- [LeetCode] Remove Linked List Elements 移除链表元素
Remove all elements from a linked list of integers that have value val. Example Given: 1 --> 2 -- ...
- 彻底搞懂编码 GBK 和 UTF8
常用编码格式一览 首先来看一下常用的编码有哪些,截图自Notepad++.其中ANSI在中国大陆即为GBK(以前是GB2312),最常用的是 GBK 和 UTF8无BOM 编码格式.后面三个都是有BO ...
- 原生js实现fadein 和 fadeout
js里面设置DOM节点透明度的函数属性:filter= "alpha(opacity=" + value+ ")"(兼容ie)和opacity=value/10 ...
- [板子]ISAP
ISAP求最大流,敲了一发板子,无压行,教程略去.转载请随意. #include <cstdio> #include <cstring> #include <algori ...
- 【WPF】wpf image控件加载网络图片不显示问题,
1.加载网络图片到内存system.drawing.image对象中2.内存中的image 转Bitmap 再转适合system.windows.controls.image 的BitmapImage ...
- geolocation/ 百度地图api Geolocation 定位当前城市信息
根据当前所处位置 定位所在城市信息 <html> <head> <meta charset="UTF-8" /> <title>js ...
- listbox 多选删除(找了好多都不行,终于让我写出来了)
方法一:两个for循环 aspx.cs private string id=""; protected void btn_del_Click(object sender, Even ...