以前一直觉得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. BZOJ 1212: [HNOI2004]L语言 [AC自动机 DP]

    1212: [HNOI2004]L语言 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1367  Solved: 598[Submit][Status ...

  2. Java程序设计之链表结构

    唉,说点废话,昨天偶尔看到一年前自己用C解约瑟夫环问题的循环链表,唏嘘不已,想想自己一年前嵌入式的梦呢,这两天发生了许多,而有些人不在了就真的不在了,心情不好,不多说了,直接上代码,只是些链表的基本操 ...

  3. 【C#】调度程序进程已挂起,但消息仍在处理中;

    环境:WPF.弹窗,messageBox.show();错误信息:调度程序进程已挂起,但消息仍在处理中:解决方法:Dispatcher.BeginInvoke(new Action(()=>{  ...

  4. Bootstap datetimepicker报错TypeError: intermediate value

    Bootstrap datetimepicker有多个版本,官方的链接中,只是datepicker,没有时间的选择,原版的datetimepicker也不再更新,不能用新版的jquery.现在http ...

  5. 如何使用PullToRefresh

    这里有详解 PullToRefresh使用详解(一)--构建下拉刷新的listView PullToRefresh使用详解(二)---重写BaseAdapter实现复杂XML下拉刷新 PullToRe ...

  6. 练习JavaScript实现过滤特殊字符

    for循环遍历特殊字符和用户输入字符,然后做比较,返回结果. <script type="text/javascript"> var name = prompt(&qu ...

  7. java中关键字volatile的作用

    用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B.只在某些动作时才进行A和B的同步.因此存在A和B不一致的情况.volatile就是用来 ...

  8. BZOJ 2039: [2009国家集训队]employ人员雇佣

    2039: [2009国家集训队]employ人员雇佣 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1369  Solved: 667[Submit ...

  9. OI省选算法汇总

    copy from hzwer @http://hzwer.com/1234.html 侵删 1.1 基本数据结构 1. 数组 2. 链表,双向链表 3. 队列,单调队列,双端队列 4. 栈,单调栈 ...

  10. 5分钟部署ELK+filebeat5.1.1

    标题有点噱头,不过网络环境好的情况下也差不多了^_^   1. 首先保证安装了jdk.   elasticsearch, logstash, kibana,filebeat都可以通过yum安装,这里前 ...