异常是指,出乎意外的事情发生。当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 “catch” 代码块。如果查找不到catch并且又没用使用 set_exception_handler() 作相应的处理的话,那么将发生一个严重的错误,并且输出 “Uncaught Exception” (未捕获异常)的错误消息。捕捉异常能使代码更加健壮。
php自带一个异常类。可以通过throw new Exception(message,code,previous);来抛出异常。例如
1
throw new Exception("趴树上的猪",1);
运行上面的代码将看到如图的效果
我们可以通过try{} catch(){}来捕获异常还是原来的代码
1
try{
2
throw new Exception("趴在树上的猪",1);
3
}catch(Exception $e){//可以理解为捕获的异常赋值给$e这个$e而是自定义的
4
var_dump($e);
5
}
这段你将看到
01
object(Exception)#1 (7) {
02
["message":protected]=>
03
string(12) "趴在树上的猪"
04
["string":"Exception":private]=>
05
string(0) ""
06
["code":protected]=>
07
int(1)
08
["file":protected]=>
09
string(22) "D:\wamp\www\test\a.php"
10
["line":protected]=>
11
int(4)
12
["trace":"Exception":private]=>
13
array(0) {
14
}
15
["previous":"Exception":private]=>
16
NULL
17
}
18
这样的输出。
方法:getMessage — 获取异常消息内容 这里将得到 趴在树上的猪 在本例中你可以这样得到$e->getMessage();
getPrevious — 返回异常链中的前一个异常
getCode — 获取异常代码 本例中可以这样得到$e->getCode()
getFile — 获取发生异常的程序文件名称
getLine — 获取发生异常的代码在文件中的行号
getTrce — 获取异常追踪信息
getTraceAsString — 获取字符串类型的异常追踪信息
__toString — 将异常对象转换为字符串
__clone — 异常克隆
如果使用自定义的类来扩展内置异常处理类,并且要重新定义构造函数的话,建议同时调用 parent::__construct()来检查所有的变量是否已被赋值。当对象要输出字符串的时候,可以重载 __toString() 并自定义输出的样式。
一个自定义异常的例子<
01
/**
02
* 自定义一个异常处理类
03
*/
04
class ZhugeException extends Exception
05
{
06
// 重定义构造器使 message 变为必须被指定的属性
07
public function __construct($message, $code = 0) {
08
// 自定义的代码
09
10
// 确保所有变量都被正确赋值
11
parent::__construct($message, $code);
12
}
13
14
// 自定义字符串输出的样式
15
public function __toString() {
16
return __CLASS__ . “: qaforcode.net [{$this->code}]: {$this->message}\n”;
17
}
18
19
public function customFunction() {
20
echo “自定义函数\n”;
21
}
22
}
23
24
try{
25
throw new ZhugeException(“爬树上的猪”,1);
26
27
}catch(ZhugeException $e){
28
var_dump($e);
29
}
因为自定义异常是Exception的子类,所以将上例chatch改成catch(Exception $e)也是成立的。在实际使用中Exception要放到最后,不然异常将只能被Exception捕捉到,这样不利于针对不同的异常做不同的处理。