phptry中抛出异常处理,php中trycatch捕获异常的例
php中try catch可以帮助我们捕获程序代码的异常了,这样我们可以很好的处理⼀些不必要的错误了,下⾯本⽂章总结了捕获异常的⼀些⽤法例⼦.
PHP中try{}catch{}语句.
PHP 5 添加了类似于其它语⾔的异常处理模块,在 PHP 代码中所产⽣的异常可被 throw语句抛出并被 catch 语句捕获,注,⼀定要先抛才能获取.
需要进⾏异常处理的代码都必须放⼊ try 代码块内,以便捕获可能存在的异常,每⼀个 try ⾄少要有⼀个与之对应的 catch.
使⽤多个 catch可以捕获不同的类所产⽣的异常,当 try 代码块不再抛出异常或者不到 catch 能匹配所抛出的异常时,PHP 代码就会在跳转到最后⼀个 catch 的后⾯继续执⾏.
当然,PHP允许在 catch 代码块内再次抛出(throw)异常,当⼀个异常被抛出时,其后(译者注:指抛出异常时所在的代码块)的代码将不会继续执⾏,⽽ PHP 就会尝试查第⼀个能与之匹配的 catch.
如果⼀个异常没有被捕获,⽽且⼜没⽤使⽤ set_exception_handler() 作相应的处理的话,那么 PHP 将会产⽣⼀个严重的错误,并且输出Uncaught Exception ...(未捕获异常)的提⽰信息.
先来看⼀下PHP内置异常类的基本属性和⽅法,不包括具体实现,代码如下:try{
}
catch(){
throw new Exception();
}
catch(){
//这⾥可以捕获到前⾯⼀个块抛出的Exception
}
为了进⼀步处理异常,我们需要使⽤PHP中try{}catch{}----包括Try语句和⾄少⼀个的catch语句,任何调⽤可能抛出异常的⽅法的代码都应该使⽤try语句,Catch语句⽤来处理可能抛出的异常,以下显⽰了我们处理getCommandObject()抛出的异常的⽅法,代码如下:<?php
try {
$mgr = new CommandManager();
$cmd = $mgr->getCommandObject("realcommand");
$cmd->execute();
} catch (Exception $e) {
try catch的使用方法
print $e->getMessage();
exit();
}
可以看到,通过结合使⽤throw关键字和PHP中try{}catch{},我们可以避免错误标记“污染”类⽅法返回的值,因为“异常”本⾝就是⼀种与其它任何对象不同的PHP内建的类型,不会产⽣混淆.
如果抛出了⼀个异常,try语句中的脚本将会停⽌执⾏,然后马上转向执⾏catch语句中的脚本.
例⼦如下,包含⽂件错误抛出异常,代码如下:<?php
// 错误的演⽰
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."
";
}
//为这个异常⾃定义⼀个处理⽅法
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;          //为对象中的成员属性赋值
}
}
}
//⽰例1,在没有异常时,程序正常执⾏,try中的代码全部执⾏并不会执⾏任何catch区块try{ $testObj =new TestException();          //使⽤默认参数创建异常的擦拭类对象
echo "********
";                    //没有抛出异常这条语句就会正常执⾏
}catch(MyException $e){                      //捕获⽤户⾃定义的异常区块
echo "捕获⾃定义的异常:$e
";          //按⾃定义的⽅式输出异常消息
$e->customFunction();                    //可以调⽤⾃定义的异常处理⽅法
}catch(Exception $e){                        //捕获PHP内置的异常处理类的对象
echo "捕获默认的异常:".$e->getMessage()."
";      //输出异常消息
}
var_dump($testObj);        //判断对象是否创建成功,如果没有任何异常,则创建成功
//⽰例2,抛出⾃定义的异常,并通过⾃定义的异常处理类捕获这个异常并处理
try{
$testObj1 =new TestException(1);        //传1时,抛出⾃定义异常
echo "********
";                    //这个语句不会被执⾏
}catch(MyException $e){                      //这个catch区块中的代码将被执⾏
echo "捕获⾃定义的异常:$e
";
$e->customFunction();
}catch(Exception $e){                        //这个catch区块不会执⾏
echo "捕获默认的异常:".$e->getMessage()."
";
}
var_dump($testObj1);        //有异常产⽣,这个对象没有创建成功
//⽰例2,抛出⾃内置的异常,并通过⾃定义的异常处理类捕获这个异常并处理try{
$testObj2 =new TestException(2);        //传⼊2时,抛出内置异常
echo "********
";                    //这个语句不会被执⾏
}catch(MyException $e){                      //这个catch区块中的代码将被执⾏
echo "捕获⾃定义的异常:$e
";
$e->customFunction();
}catch(Exception $e){                        //这个catch区块不会执⾏
echo "捕获默认的异常:".$e->getMessage()."
";
}
var_dump($testObj2);        //有异常产⽣,这个对象没有创建成功
在上⾯的代码中,可以使⽤两个异常处理类:⼀个是⾃定义的异常处理类MyException;另⼀个则是PHP中内置的异常处理类Exception,分别在try区块中创建测试类TestException的对象,并根据构造⽅法中提供的不同数字参数,抛出⾃定义异常类对象、内置的异常类对象和不抛出任何异常的情况,跳转到对应的catch区块中执⾏,如果没有异常发⽣,则不会进⼊任何⼀个catch块中执⾏,测试类TestException的对象创建成功.
欢迎转载!但请带上⽂章地址^^

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。