可以看到,通过结合使用throw关键字和PHP中try{}catch{},我们可以避免错误标记“污染”类方法返回的值。因为“异常”本身就是一种与其它任何对象不同的PHP内建的类型,不会产生混淆。如果抛出了一个异常,try语句中的脚本将会停止执行,然后马上转向执行catch语句中的脚本。例子如下:包含文件错误抛出异常 复制代码 代码如下: php // 错误的演示 try { require ('test_try_catch.php'); } catch (Exception $e) { echo $e- getMessage(); }// 正确的抛出异常 try { if (file_exists('test_try_catch.php')) { require ('test_try_catch.php'); } else { throw new Exception('file is not exists'); } } catch (Exception $e) { echo $e- getMessage(); } 如果异常抛出了却没有被捕捉到,就会产生一个fatal error。多个catch捕获多个异常PHP将查询一个匹配的catch代码块。如果有多个catch代码块,传递给每一个catch代码块的对象必须具有不同类型,这样PHP可以找到需要进入哪一个catch代码块。当try代码块不再抛出异常或者找不到catch能匹配所抛出的异常时,PHP代码就会在跳转最后一个catch的后面继续执行。多个异常的捕获的示例如下: 复制代码 代码如下: php class MyException extends Exception{ //重定义构造器使第一个参数message变为必须被指定的属性 public function __construct($message, $code=0){ //可以在这里定义一些自己的代码 //建议同时调用parent::construct()来检查所有的变量是否已被赋值 parent::__construct($message, $code); } //重写父类中继承过来的方法,自定义字符串输出的样式 public function __toString(){ return __CLASS__.":[".$this- code."]:".$this- message." br } //为这个异常自定义一个处理方法 public function customFunction(){ echo "按自定义的方法处理出现的这个类型的异常"; } }
//创建一个用于测试自定义扩展的异常类MyException class TestException{ public $var; //用来判断对象是否创建成功的成员属性 function __construct($value=0){ //通过构造方法的传值决定抛出的异常 switch($value){ //对传入的值进行选择性的判断 case 1: //掺入参数1,则抛出自定义的异常对象 throw new MyException("传入的值“1”是一个无效的参数",5);break; case 2: //传入参数2,则抛出PHP内置的异常对象 throw new MyException("传入的值“2”不允许作为一个参数",6);break; default: //传入参数合法,则不抛出异常 $this- var=$value;break; //为对象中的成员属性赋值 } } }