错误类型

PHP 主要有两种错误:触发错误和异常。其中触发错误大概可以分为:编译错误、引擎错误和运行时错误,其中前两个是无法捕获的;异常都是可以捕获的,当没有尝试捕获时则会中断代码。

触发错误可以通过 error_get_last() 来进行获得,异常可以使用标准的 try...catch 语句来捕获。

处理方式

错误报告

error_reporting() 函数是 PHP 提供的一个控制错误等级的函数,如果设置了对应的错误等级,则只会在对应错误等级触发时才会在页面(或输出,对于命令行来说)输出响应的错误信息。

error_reporting(int level) 支持等级 level 参数使用二进制的数字来配置错误等级,错误等级一般用常量来代替对应的二进制标识。例如:E_ALL、E_NOTICE、 E_USER_NOTICE 等等;如果不传递参数,则会返回当前的错误等级(一般用来保存当前的错误等级以供后续恢复)。

其中 E_PARSE、E_COMPILE_* 和 E_CORE_* 是非运行时错误,无法被捕获的

php.ini

配置文件是 PHP 初始化的默认配置,通过修改某些参数可以控制对应的初始化参数。如果要控制错误,可以通过以下几个方式来配置:

display_errors - 是否显示错误,一般在生产环境建议关闭该参数并和下列的参数一起试用 log_errors - 记录错误开关,如果打开会记录到对应位置 error_log - 记录错误日志的位置,不指定为系统默认 error_reporting - 同上面的函数

错误抑制

PHP 提供了一种特殊的操作,通过在语句前面加上抑制错误操作符@来抑制该语句出现错误。这种情况通常用于你不知道会发生什么情况下使用,比如打开了不确定的文件或者网络 URL,但一般不推荐使用

抑制错误本身内部做了一系列的处理才达到该效果,并且对于错误本身完全是未知的,一般情况下,不建议这么使用

捕获异常

几乎在所有语言中,都会有对于异常的处理。如果程序抛出一个异常,那么可以通过 try…catch 语句来捕获该异常,如果明确知道错误的类型,也可以只捕获该类型的错误。try…catch 是一种最标准的错误处理方式

1
2
3
4
5
try {
// 代码部分
} catch (Exception $e) {
// 根据异常对象对 $e 进行处理
}

设置错误处理器

PHP 提供了 set_error_handler() 函数来让开发者传入一个函数名(或匿名函数,对于 5.2 以上的 PHP)就可以让所有的错误进入该函数,然后开发者可以在函数内进行控制,举例说明

1
2
3
set_error_handler(function($code, $msg){
log_error("$msg occur with code $code");
});

对应地,PHP 也提供了 restore_error_handler() 来恢复为标准的 PHP 错误控制。

设置异常处理器

如果每个异常都去捕获,显然是很复杂的事情,需要编写很多代码,而且维护起来会比较复杂,对于一个快速编程的语言来说,PHP 自然不会允许发生这种事情。使用 set_exception_handler() 就可以像上面错误处理控制器一样接收所有未捕获的异常,然后做一些该做的事情,甚至还可以再把错误抛出来。例如:

1
2
3
set_exception_handler(function($exception){
log_error("Exception occur: $exception");
});

崩溃捕获

该类处理并非 PHP 标准的处理方式,但对于某种使程序崩溃的无法捕获的错误确实很有用,它是指注册一个 shutdown 函数,在函数内通过调用 error_get_last() 来获取最后的错误,并且根据错误等级来做相应的处理。

1
2
3
4
5
6
register_shutdown_function(function(){
$error = error_get_last();
if ($error && $error['code']()() & error_reporting()) {
// 崩溃错误,记录日志
}
});

PHP的错误处理方式的更多相关文章

  1. VS2012 编译程序时报无法载入PDB文件错误解决方式

    VS2012 编译程序时报无法载入PDB文件错误解决方式 "ConsoleApplication1.exe"(Win32): 已载入"C:\Users\hp\Docume ...

  2. Entity Framework学习笔记——记一个错误解决方式及思路

    继续之前设定的学习目标前,先来一篇小小的外篇.按照第一篇里的配置方式配置好的工程前两天还能正常工作,昨天却突然无法通过Add-Migration命令进行数据库的升级.错误信息如下: System.Da ...

  3. 8000401a错误解决方式(Excel)

    前一阵子做开发须要用到Excel和Word编程,本人用的是Vista系统,开发环境是VS2005和Office2007,測试无不论什么问题,但是到部署的时候出现了一些令人非常头痛的问题,老是会出现比如 ...

  4. Android加载图片OOM错误解决方式

    前几天做项目的时候,甲方要求是PAD (SAMSUNG P600 10.1寸 2560*1600)的PAD上显示高分辨率的大图片. SQLITE採用BOLD方式存储图片,这个存取过程就不说了哈,网上一 ...

  5. 使用AndroidStudio编译NDK的方法及错误解决方式

    參考资料: [android ndk]macos环境下Android Studio中利用gradle编译jni模块及配置:http://demo.netfoucs.com/ashqal/article ...

  6. PHP的错误处理方式(开发和上线)

    对于PHP开发人员来说,一旦某个产品投入使用.应该马上将 display_errors选项关闭.以免由于这些错误所透露的路径.数据库连接.数据表等信息而遭到黑客攻击. 可是.不论什么一个产品在投入使用 ...

  7. redis 创建集群时 出现的错误解决方式

    1. 创建集群时报以下错误 (1)错误1 ./redis-trib.rb create --replicas 1 XXXXXX:5301 XXXXXX:5302 XXXXXX:5303 XXXXXX: ...

  8. HTML使用post方式提交中文内容出现乱码的错误解决方式

    今天在做一个例子的时候,使用post方式提交表单,如果有中文的话,在另一个页面显示出来的时候,总是会出现乱码: 但是将提交方式改为get的时候,就不会出现这种错误. 详细错误见下面图片和代码. HTM ...

  9. apt-get install安装软件时出现依赖错误解决方式

    在使用apt-get install安装软件时,常常会遇到如上图所看到的错误.该错误的意思为缺少依赖软件.解决方式为: aptitude install golang-go

随机推荐

  1. C语言--const修饰指针解析

          这种例子在我们平时编程时可能会很少用,但是在面试时被问的可能性就很大了. 用const修饰指针,常见的情况可以分为四种: 1.const int *p; // p 可变,p 指向的对象不可 ...

  2. Spring简单的小例子SpringDemo,用于初略理解什么是Spring以及JavaBean的一些概念

    一.开发前的准备 两个开发包spring-framework-3.1.1.RELEASE-with-docs.zip和commons-logging-1.2-bin.zip,将它们解压,然后把Spri ...

  3. Selenium2学习之-环境搭建

    1.下载安装Eclipse 2.下载并配置jdk环境变量 2.1 介绍一下环境变量设置 2.1.1 点击环境变量 2.1.2 新增系统变量JAVA_HOME 变量名:JAVA_HOME 变量值:C:\ ...

  4. 学习在创建好的工程里面添加CoreData

    在学习CoreData中, 在建工程后, 没有添加, 于是就参考网络文章进行更改. 这几天在学习做一个ios的小项目,项目中需要对数据进行基本的增删改查操作.于是就想用一把CoreData.但在创建项 ...

  5. javascript 字符串转为对像函数eval("string")

    javascript有一个很有用的函数eval("string")这个函数可以把字符串转换为对象或者可以执行的语句,例如你的代码可以用obj2=eval("documen ...

  6. C#string与char互转

    string s = "asdf"; //字符转char char[] c = s.ToCharArray(); Console.WriteLine(s[]); //char转st ...

  7. 23 读取excel

    /** index mappingname originalname datatype family 0 task_id taskIndexCode STRING info 1 task_type r ...

  8. 概率dp小结

    好久之前学过,记得是一次亚洲区的前几天看了看概率dp,然后亚洲区就出了一道概率dp,当时虽然做上了,但是感觉有很多地方没懂,今天起早温习了一下,觉得很多地方茅塞顿开,果然学习的话早上效果最好了. 首先 ...

  9. CSS应用二

    样式中的顺序问题. 如:padding,margin,border,等,都是按照顺时针方向赋值的,及上右下左. Padding:1px 2px 3px 4px;(top:1px;right:2px;b ...

  10. ThinkPHP整合百度Ueditor

    文章来源:http://www.thinkphp.cn/code/267.html ThinkPHP整合百度Ueditor,基于黄永成老师的视频说明的申明:最好大家都能写绝对路径的都写好绝对路径比如: ...