### PHP错误机制
在 PHP 中,默认的错误处理很简单。一条消息会被发送到浏览器,这条消息带有文件名、行号以及一条描述错误的消息。在创建脚本和 web 应用程序时,错误处理是一个重要的部分。如果您的代码缺少错误检测编码,那么程序看上去很不专业,也为安全风险敞开了大门。
### PHP 中一些最为重要的错误检测方法。
-
简单的 "die()" 语句
~~~
if(!file_exists("../func.php")){
die("文件不存在<br/>");
} else {
$fp=fopen("../func.php","r");
echo "文件打开成功<br/>";
//..关闭
fclose($fp);
}
~~~
-
更简洁的方式
~~~
file_exists("func.php") or die("文件不存在<br/>");
~~~
这句相当于把上面的if...else合并到一起了!
-
创建自定义错误检测机制
看下面的代码,假设文件是不存的运行的时候会报错如下:
~~~
<?php
$file=fopen("welcome.txt","r");
?>
~~~
错误信息如下(PHP默认的错误处理机制):
~~~
Warning: fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in C:\webfolder\test.php on line 2
~~~
创建一个自定义的错误处理器非常简单。我们很简单地创建了一个专用函数,可以在 PHP 中发生错误时调用该函数。该函数必须有能力处理至少两个参数 (error level 和 error message),但是可以接受最多五个参数(可选的:file, line-number 以及 error context):
###系统自带的错误函数:
~~~
error_function(error_level,error_message,error_file,error_line,error_context)
~~~
参数分析:
<table class="dataintable "><tbody><tr><th>参数</th><th>描述</th></tr><tr><td>error_level</td><td><p>必需。为用户定义的错误规定错误报告级别。必须是一个值数。</p><p>参见下面的表格:错误报告级别。</p></td></tr><tr><td>error_message</td><td>必需。为用户定义的错误规定错误消息。</td></tr><tr><td>error_file</td><td>可选。规定错误在其中发生的文件名。</td></tr><tr><td>error_line</td><td>可选。规定错误发生的行号。</td></tr><tr><td>error_context</td><td>可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值。</td></tr></tbody></table>
### 错误报告级别
这些错误报告级别是错误处理程序旨在处理的错误的不同的类型:
<table class="dataintable "><tbody><tr><th>值</th><th>常量</th><th>描述</th></tr><tr><td>2</td><td>E_WARNING</td><td>非致命的 run-time 错误。不暂停脚本执行。</td></tr><tr><td>8</td><td>E_NOTICE</td><td><p>Run-time 通知。</p><p>脚本发现可能有错误发生,但也可能在脚本正常运行时发生。</p></td></tr><tr><td>256</td><td>E_USER_ERROR</td><td>致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。</td></tr><tr><td>512</td><td>E_USER_WARNING</td><td>非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。</td></tr><tr><td>1024</td><td>E_USER_NOTICE</td><td>用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。</td></tr><tr><td>4096</td><td>E_RECOVERABLE_ERROR</td><td>可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler())</td></tr><tr><td>8191</td><td>E_ALL</td><td><p>所有错误和警告,除级别 E_STRICT 以外。</p><p>(在 PHP 6.0,E_STRICT 是 E_ALL 的一部分)</p></td></tr></tbody></table>
### 错误报告级别
这些错误报告级别是错误处理程序旨在处理的错误的不同的类型:
<table class="dataintable "><tbody><tr><th>值</th><th>常量</th><th>描述</th></tr><tr><td>2</td><td>E_WARNING</td><td>非致命的 run-time 错误。不暂停脚本执行。</td></tr><tr><td>8</td><td>E_NOTICE</td><td><p>Run-time 通知。</p><p>脚本发现可能有错误发生,但也可能在脚本正常运行时发生。</p></td></tr><tr><td>256</td><td>E_USER_ERROR</td><td>致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。</td></tr><tr><td>512</td><td>E_USER_WARNING</td><td>非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。</td></tr><tr><td>1024</td><td>E_USER_NOTICE</td><td>用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。</td></tr><tr><td>4096</td><td>E_RECOVERABLE_ERROR</td><td>可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler())</td></tr><tr><td>8191</td><td>E_ALL</td><td><p>所有错误和警告,除级别 E_STRICT 以外。</p><p>(在 PHP 6.0,E_STRICT 是 E_ALL 的一部分)</p></td></tr></tbody></table>
### 下面是我们自己实现的错误处理函数:
~~~
<?php
//自定义自己的错误处理函数
function myerror($errno,$errstr){
echo "<font size='5' color='red'>$errno</font><br/>";
echo "错误信息:".$errstr;
}
//这里我们还需要改写set_error_handler
/*PHP 的默认错误处理程序是内建的错误处理程序。我们打算把上面的函数改造为脚本运行期间的默认错误处理程序。set_error_handler() 仅需要一个参数,可以添加第二个参数来规定错误级别。
*/
set_error_handler("myerror",);
echo($test);
/*输出下面的内容:
8
错误信息:Undefined variable: test
*/
?>
~~~
###错误触发器:
错误触发器和错误处理器区别:触发器往往处理逻辑上的错误,处理器处理系统上的错误:
看下面的需求:当输入年龄大于120时,会触发错误!
~~~
$age = 200;
if($age>120){
trigger_error("the age is logger!",E_USER_WARNING);
exit();
}
~~~
运行上面的代码会出现下面的错误:
~~~
**Warning**: the age is logger! in /var/myphp/exec/File.php on line 3
~~~
看处理器一样,上面的警告信息是系统打印出来的。那么我们将处理器和错误触发器共同使用,看下面的代码:
###
~~~
<?php //自定义自己的错误处理函数
function myerror($errno,$errstr){
echo "<font size='5' color='red'>$errno</font><br/>";
echo "错误信息:".$errstr;
}
//指定错误的处理函数,
set_error_handler("myerror",E_USER_WARNING);
$age = 200;
if($age>120){
//E_USER_WARNING 这里必须和制定错误处理函数对应,否则还是会调用系统错误处理函数
trigger_error("the age is logger!",E_USER_WARNING);
exit();
}
/*512
错误信息:the age is logger!
*/
?>
~~~
### 可能的错误类型:
- E_USER_ERROR - 致命的用户生成的 run-time 错误。错误无法恢复。脚本执行被中断。
- E_USER_WARNING - 非致命的用户生成的 run-time 警告。脚本执行不被中断。
- E_USER_NOTICE - 默认。用户生成的 run-time 通知。脚本发现了可能的错误,也有可能在脚本运行正常时发生。
### 错误日志:
[http://blog.csdn.net/heiyeshuwu/article/details/577838](http://blog.csdn.net/heiyeshuwu/article/details/577838) 这个博客有介绍,可以看看!
默认地,根据在PHP.ini中的error_log配置,PHP想服务器的错误记录系统或者文件发送错误日志,通过使用error_log()函数,您可以向指定的文件或远程目的地发送错误记录
~~~
bool error_log ( string message [, int message_type [, string destination [, string extra_headers]]] )
~~~
~~~
<?php
//设置时区
date_default_timezone_set("Asia/Chongqing");
//自定义自己的错误处理函数
function myerror($errno,$errstr){
$error_info="错误信息:".$errno.$errstr;
error_log(date("Y-m-d G-i-s").$error_ingo."\r\n",3,"1.txt");
}
set_error_handler("myerror",E_USER_WARNING);
$age = 200;
if($age>120){
trigger_error("the age is logger!",E_USER_WARNING);
exit();
}
?>
~~~
### 二、PHP异常处理【重点】
### 基本语法:
~~~
try{
//可能出现错误或异常的代码
//catch 捕获 Exception是php已定义好的异常类
} catch(Exception $e){
//对异常处理,方法:
//1、自己处理
//2、不处理,将其再次抛出
}
~~~
处理处理程序应当包括:
1. Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
1. Throw - 这里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"
1. Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象
看下面的例子:
~~~
<?php
//创建一个抛出异常的函数
function checkNum($number){
if($number >1){
throw new Exception("Value must be 1 or little!<br/>");
}
return true;
}
//在 try 代码块中触发异常
try{
$num = 2;
checkNum($num);//AAAA
echo "如何抛出异常,这个将不会被执行!<br/>";
}catch(Exception $e){
//捕获异常
echo 'Message:'.$e->getMessage();
}
echo "继续执行<br/>";
?>
~~~
当$num=2;将会抛开异常,打印下面的语句:
Message:Value must be 1 or little!
继续执行
**当$num=0;将会抛开异常,打印下面的语句:**
**如何抛出异常,这个将不会被执行!
继续执行**
从上面可以得出下面的结论:
1、出捕获异常并不会干扰下面代码的执行!
2、如果异常抛出,其后面的语句将不会被执行;
看下面的代码我们自己设置定义异常处理函数:
~~~
<?php
function my_exception($e){
echo "我是顶级处理器:".$e->getMessage.$e->getline;
}
//修改默认的顶级异常处理函数
set_exception_handler("my_exception");
function a1($val){
if($val>100){
//抛出异常
throw new Exception("val > 100!<br/>");
}
}
function a2($val){
if($val=="jsh"){
//抛出异常
throw new Exception("val jsh!<br/>");
}
}
try{
a2("jsh");//这是会抛出异常
}catch(Exception $e){
//获取异常
echo $e->getMessage();
//可以继续抛出,这是会启动PHP默认的异常处理机制
//我们可以自己定义一个顶级异常处理函数
throw $e;
}
?>
~~~
### 异常的规则:
1、需要进行异常处理的代码放入try代码块内,以便捕获潜在的异常。
2、每个try或者,throw代码块至少拥有一个catch代码。
3、使用多个catch代码块可以捕获不同种类的异常。
~~~
try{
XXXXXX;
}catch(my_exception $e){//自己定义的异常处理函数
XXXXXX;
}catch(Exception $3){//系统自带的异常处理函数
XXXXX;
}
~~~
4、可以在try代码块中再次抛出异常
5,如果抛出了异常,就必须捕获他,获知使用顶级异常处理机制。
看下面的代码示例,是在PHP手册中的,仔细获得下吧
~~~
<?php
/**
* 自定义一个异常处理类
*/
class MyException extends Exception
{
// 重定义构造器使 message 变为必须被指定的属性
public function __construct($message, $code = 0) {
// 自定义的代码
// 确保所有变量都被正确赋值
parent::__construct($message, $code);
}
// 自定义字符串输出的样式 */
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
}
public function customFunction() {
echo "A Custom function for this type of exception\n";
}
}
/**
* 创建一个用于测试异常处理机制的类
*/
class TestException
{
public $var;
const THROW_NONE = 0;
const THROW_CUSTOM = 1;
const THROW_DEFAULT = 2;
function __construct($avalue = self::THROW_NONE) {
switch ($avalue) {
case self::THROW_CUSTOM:
// 抛出自定义异常
throw new MyException('1 is an invalid parameter', 5);
break;
case self::THROW_DEFAULT:
// 抛出默认的异常
throw new Exception('2 isnt allowed as a parameter', 6);
break;
default:
// 没有异常的情况下,创建一个对象
$this->var = $avalue;
break;
}
}
}
// 例子 1
try {
$o = new TestException(TestException::THROW_CUSTOM);
} catch (MyException $e) { // 捕获异常
echo "Caught my exception:<br/>", $e;
$e->customFunction();
} catch (Exception $e) { // 被忽略
echo "Caught Default Exception:<br/>", $e;
}
/*
// 执行后续代码
var_dump($o);
echo "<br/>";
// 例子 2
try {
$o = new TestException(TestException::THROW_DEFAULT);
} catch (MyException $e) { // 不能匹配异常的种类,被忽略
echo "Caught my exception\n", $e;
$e->customFunction();
} catch (Exception $e) { // 捕获异常
echo "Caught Default Exception\n", $e;
}
// 执行后续代码
var_dump($o);
echo "<br/>";
// 例子 3
try {
$o = new TestException(TestException::THROW_CUSTOM);
} catch (Exception $e) { // 捕获异常
echo "Default Exception caught\n", $e;
}
// 执行后续代码
var_dump($o);
echo "<br/>";
// 例子 4
try {
$o = new TestException();
} catch (Exception $e) { // 没有异常,被忽略
echo "Default Exception caught\n", $e;
}
*/
// 执行后续代码
var_dump($o);
echo "<br/>";
?>
~~~
- 前言
- HTML(第一天)
- HTML(第二天)
- DIV+CSS(第一天)
- DIV+CSS(第二天)
- DIV+CSS(第三天)
- DIV+CSS(第四天)
- PHP开发环境配置说明
- PHP基础数据类型及运算符介绍
- 走进PHP函数
- 走进位运算
- 走进数组及相关数组函数
- 面向对象的编程(类与对象)
- 面向对象的编程(类成员方法用法)
- 构造方法,析构方法
- static,global用法
- 静态方法
- 面向对象的编程方法
- 接口方法
- 接口VS继承、final、const
- 错误及异常处理机制、错误日志
- HTTP协议深度剖析
- 文件下载
- PHP数据库编程
- 数据库编程(2)
- 超全局变量
- Zend studio 开发环境入门
- 雇员管理系统(1)
- 雇员管理系统(2)
- 会话技术(cookie session)
- 会话技术 session场景使用介绍!
- PHP.in中session和cookie的配置说明
- PHP文件编程
- 报表及绘图技术
- 报表及绘图技术(jpgraph库使用,Linux安装及配置说明)
- XML基本语法及DTD介绍
- XML编程(Dom技术)
- XML编程(Xpath技术,simpleXml技术)基础入门
- 网上支付平台PHP版本
- javascript基础入门