以前一直觉得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错误以及异常处理的更多相关文章

  1. Yii中的错误及异常处理

    Yii中的错误及异常处理 Yii已经默认已经在CApplication上实现了异常和错误的接管,这是通过php的set_exception_handler, set_error_handler实现的. ...

  2. 再谈PHP错误与异常处理

    博客好久没有更新了,实在惭愧,最近在忙人生大事,哈哈!这段时间没有看什么新的东西,结合项目中遇到的PHP异常处理问题,我又重新梳理了之前模糊的概念,希望对大家理解PHP异常处理有所帮助. 请一定要注意 ...

  3. Golang错误和异常处理的正确姿势

    Golang错误和异常处理的正确姿势 错误和异常是两个不同的概念,非常容易混淆.很多程序员习惯将一切非正常情况都看做错误,而不区分错误和异常,即使程序中可能有异常抛出,也将异常及时捕获并转换成错误.从 ...

  4. 【PHP】解析PHP中的错误和异常处理

    目录结构: contents structure [-] 错误级别 自定义处理器 设置异常日志 自定义异常类 在这篇文章中,笔者将会阐述PHP中的异常处理,希望能够对你有所帮助. 1.错误级别 PHP ...

  5. ThinkPHP5.0源码学习之注册错误和异常处理机制

    在base.php文件中,用一句代码\think\Error::register();实现错误和异常处理机制的注册. // 注册错误和异常处理机制 \think\Error::register(); ...

  6. 2018/05/02 PHP 之错误与异常处理

    在学习中,越学习越觉得自己基础薄弱. 在平常工作中,对于某些错误处理感觉不知道怎么下手,于是决定重新再整理一下. 强烈推荐这篇文章,真的感觉学习到了很多. 部分引用::再谈PHP错误与异常处理 -- ...

  7. PHP 注册错误和异常处理机制

    注册错误和异常处理机制有三个PHP函数需要学习 1. register_shutdown_function('Bootstrap\Library\Frame::fatalError'); 2. set ...

  8. PHP常用功能块_错误和异常处理 — php(32)

    一.错误和异常处理 1.1 错误类型和基本的调试方法PHP程序的错误发生一般归属于下列三个领域: 语法错误:语法错误最常见,并且也容易修复.如:代码中遗漏一个分号.这类错误会阻止脚本的执行. 运行时错 ...

  9. php 错误和异常处理

    一.错误和异常处理 1.1 错误类型和基本的调试方法 PHP程序的错误发生一般归属于下列三个领域: 语法错误: 语法错误最常见,并且也容易修复.如:代码中遗漏一个分号.这类错误会阻止脚本的执行. 运行 ...

随机推荐

  1. AC日记——最小的N个和 codevs 1245

    1245 最小的N个和  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 有两个长度为 N ...

  2. MFC画线功能总结

    本文仅用于学习交流,商业用途请支持正版!转载请注明:http://www.cnblogs.com/mxbs/p/6216464.html MFC画线功能要点有二:其一,鼠标按下时记录初始位置为线的起始 ...

  3. c# 三种常见的委托

    参考  <编写高质量代码:改善C#程序的157个建议> , 尽量使用FCL中的委托声明. FCL: FrameWork Class Library 三种常用:Action.Func.Pre ...

  4. Django之Model操作

    Django之Model操作 本节内容 字段 字段参数 元信息 多表关系及参数 ORM操作 1. 字段 字段列表 AutoField(Field) - int自增列,必须填入参数 primary_ke ...

  5. Nginx支持比Apache高并发的原因

    1.先从各自使用的多路复用IO模型说起:  select模型:(apache使用,由于受模块等限制,用的不多)   单个进程能够 监视的文件描述符的数量存在最大限制 select()所维护的 存储大量 ...

  6. Lua面线对象学习

    --[[ ]] local userdata = {} local Register = {} function Register:del(key) userdata[self.namespace][ ...

  7. ELK日志系统:Filebeat使用及Kibana如何设置登录认证

    根据elastic上的说法: Filebeat is a lightweight, open source shipper for log file data. As the next-generat ...

  8. [转] eclipse SVN中文件修改后图标不变黑星解决

    原文地址:http://blog.csdn.net/luwei42768/article/details/39225641 版权声明:本文为博主原创文章,未经博主允许不得转载. 如上图, 如果文件修改 ...

  9. linux 常见命令

    redhat 1.获取apt软件列表 sudo apt-cache search all 2.添加用户并创建目录 sudo useradd -m username -s /sbin/bash 3.vs ...

  10. 【转】MipMap

    原文地址http://www.cppblog.com/wc250en007/archive/2011/08/06/152653.html 首先从MIPMAP的原理说起,它是把一张贴图按照2的倍数进行缩 ...