以前一直觉得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. C#中ToString()格式详解

    以下内容均摘自博客园,仅供资料查询. ToString格式化 在很多对象显示为字符串的时候都会使用到ToString中的格式化,由于以前没怎么注意到这个问题,想总结一下各个基础结构对象的格式化,以便后 ...

  2. MVC+EF6+Oracle,提示ORA-01918: user '***' does not exist

    1.在上下文里重载OnModelCreating:        //没用到这个方法         protected override void OnModelCreating(DbModelBu ...

  3. [LeetCode] Longest Increasing Subsequence 最长递增子序列

    Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...

  4. [LeetCode] Remove Linked List Elements 移除链表元素

    Remove all elements from a linked list of integers that have value val. Example Given: 1 --> 2 -- ...

  5. 彻底搞懂编码 GBK 和 UTF8

    常用编码格式一览 首先来看一下常用的编码有哪些,截图自Notepad++.其中ANSI在中国大陆即为GBK(以前是GB2312),最常用的是 GBK 和 UTF8无BOM 编码格式.后面三个都是有BO ...

  6. 原生js实现fadein 和 fadeout

    js里面设置DOM节点透明度的函数属性:filter= "alpha(opacity=" + value+ ")"(兼容ie)和opacity=value/10 ...

  7. [板子]ISAP

    ISAP求最大流,敲了一发板子,无压行,教程略去.转载请随意. #include <cstdio> #include <cstring> #include <algori ...

  8. 【WPF】wpf image控件加载网络图片不显示问题,

    1.加载网络图片到内存system.drawing.image对象中2.内存中的image 转Bitmap 再转适合system.windows.controls.image 的BitmapImage ...

  9. geolocation/ 百度地图api Geolocation 定位当前城市信息

    根据当前所处位置 定位所在城市信息 <html> <head> <meta charset="UTF-8" /> <title>js ...

  10. listbox 多选删除(找了好多都不行,终于让我写出来了)

    方法一:两个for循环 aspx.cs private string id=""; protected void btn_del_Click(object sender, Even ...