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 // 执行后续代码
MyException 类是作为旧的 exception 类的一个扩展来创建的。这样它就继承了旧类的所有属性和方法,我们可以使用 exception 类的方法,比如 getLine() 、 getFile() 以及 getMessage()。
原文地址:http://blog.csdn.net/qq_25077833/article/details/50676590