PHP异常处理---try{...}catch{...}使用详解

这篇文章很好讲解了php 异常处理

一、异常处理的概念

异常处理(又称为错误处理)功能提供了处理程序运行时出现的错误或异常情况的方法。

PHP 5 提供了一种新的面向对象的错误处理方法。可以使用检测(try)、抛出(throw)和捕获(catch)异常。即使用try检测有没有抛出(throw)异常,若有异常抛出(throw),使用catch捕获异常。

一个 try 至少要有一个与之对应的 catch。定义多个 catch 可以捕获不同的对象。PHP 会按这些 catch 被定义的顺序执行,直到完成最后一个为止。而在这些 catch 内,又可以抛出新的异常。

二、异常处理内置类Exception

首先PHP为异常处理提供了一个内置类-Exception,其定义如下所示:

 1 class Exception
 2 {
 3 protected $message = 'Unknown exception';   // 异常信息
 4 protected $code = 0;                        // 用户自定义异常代码
 5 protected $file;                            // 发生异常的文件名
 6 protected $line;                            // 发生异常的代码行号
 7 function __construct($message = null, $code = 0);
 8 final function getMessage();                // 返回异常信息
 9 final function getCode();                   // 返回异常代码
10 final function getFile();                   // 返回发生异常的文件名
11 final function getLine();                   // 返回发生异常的代码行号
12 final function getTrace();                  // backtrace() 数组
13 final function getTraceAsString();          // 已格成化成字符串的 getTrace() 信息
14 /* 可重载的方法 */
15 function __toString();                       // 可输出的字符串
16 }

可以看到其构造函数需要两个参数:message和code 
1. message为用户自定义的错误信息,需用双引号" "括起 
2. code为用户自定义的错误代码号

三、异常的使用

当一个异常被抛出时,其后的代码将不会继续执行,PHP 会尝试查找匹配的 “catch” 代码块。如果一个异常没有被捕获,而且又没用使用set_exception_handler() 作相应的处理的话,那么 PHP将会产生一个严重的错误,并且输出未能捕获异常(Uncaught Exception … )的提示信息。

3.1、测试1


 1 <?php
 2 try{
 3   if(1==1){
 4     throw new Exception("aaa<br/>",10086);
 5    }
 6   echo "bbb";
 7 }
 8 catch (Exception $e){
 9 echo "错误代码:".$e->getCode()."错误信息:".$e->getMessage();
10 }
11 echo "ddd";
12 ?>

使用如上测试代码,输出结果为

错误代码:10086错误信息:aaa
ddd

说明当1==1时也即可判断一个条件为真时,进入if语句中,通过throw抛出一个异常,并跳过了try中该throw语句后面的所有代码(只跳过了try语句中的代码,不是后面所有的代码),接着catch获取这个异常并定义了一个$e读取这个异常,通过调用内置类的两个函数getCode()和getMessage()可获取相应的异常信息(也可调用其他函数获取其他信息),接着继续执行后面的代码

 3.2、测试2

 1 <?php
 2 try{
 3 if(1==2)
 4 {
 5 throw new Exception("aaa<br/>",10086);
 6 }
 7 echo "bbb";
 8 }
 9 catch (Exception $e){
10 echo "错误代码:".$e->getCode()."错误信息:".$e->getMessage();
11 }
12 echo "ddd";
13 ?>

使用如上测试代码,输出结果为

bbbddd

未在try语句中进入if语句,也即未抛出异常,catch语句不会被执行,只按顺序输出bbbddd

四、自定义异常处理类

如果使用自定义的类来扩展内置异常处理类,并且要重新定义构造函数的话,建议同时调用 parent::__construct() 来检查所有的变量是否已被赋值。当对象要输出字符串的时候,可以重载__toString() 并自定义输出的样式。
构建自定义异常处理类:

 1 <?php
 2 /**
 3 *
 4 * 自定义一个异常处理类
 5 */
 6 class MyException extends Exception
 7 {
 8 // 重定义构造器使 message 变为必须被指定的属性
 9 public function __construct($message, $code = 0) {
10 // 自定义的代码
11 // 确保所有变量都被正确赋值
12 parent::__construct($message, $code);
13 }
14 // 自定义字符串输出的样式 */
15 public function __toString() {
16 return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
17 }
18 public function customFunction() {
19 echo "A Custom function for this type of exception\n";
20 }
21 }
22 // 例子 1:抛出自定义异常,但没有默认的异常
23 echo ' 例子 1', '<br>';
24 try {
25 // 抛出自定义异常
26 throw new MyException('1 is an invalid parameter', 5);
27 } catch (MyException $e) {      // 捕获异常
28 echo "Caught my exception\n", $e;
29 $e->customFunction();
30 } catch (Exception $e) {        // 被忽略
31 echo "Caught Default Exception\n", $e;
32 }
33 // 执行后续代码
34 // 例子 2: 抛出默认的异常  但没有自定义异常
35 echo '<br>', ' 例子 2:', '<br>';
36 try {
37 // 抛出默认的异常
38 throw new Exception('2 isnt allowed as a parameter', 6);
39 } catch (MyException $e) {      // 不能匹配异常的种类,被忽略
40 echo "Caught my exception\n", $e;
41 $e->customFunction();
42 } catch (Exception $e) {// 捕获异常
43 echo "Caught Default Exception\n", $e;
44 }
45 // 执行后续代码
46 // 例子 3: 抛出自定义异常 ,使用默认异常类对象来捕获
47 echo '<br>', ' 例子 3:', '<br>';
48 try {
49 // 抛出自定义异常
50 throw new MyException('3 isnt allowed as a parameter', 6);
51 } catch (Exception $e) {        // 捕获异常
52 echo "Default Exception caught\n", $e;
53 }
54 // 执行后续代码
55 // 例子 4
56 echo '<br>', ' 例子 4:', '<br>';
57 try {
58 echo 'No Exception ';
59 } catch (Exception $e) {        // 没有异常,被忽略
60 echo "Default Exception caught\n", $e;
61 }
62 ?>
63 // 执行后续代码
View Code

MyException 类是作为旧的 exception 类的一个扩展来创建的。这样它就继承了旧类的所有属性和方法,我们可以使用 exception 类的方法,比如 getLine() 、 getFile() 以及 getMessage()。

原文地址:http://blog.csdn.net/qq_25077833/article/details/50676590

posted @ 2016-06-16 12:11  黄加菜  阅读(262)  评论(0编辑  收藏  举报