찾다
php教程php手册php中try catch 捕获异常的例

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) {    
print $e->getMessage();    
exit();    
}

可以看到,通过结合使用throw关键字和PHP中try{}catch{},我们可以避免错误标记“污染”类方法返回的值,因为“异常”本身就是一种与其它任何对象不同的PHP内建的类型,不会产生混淆.

如果抛出了一个异常,try语句中的脚本将会停止执行,然后马上转向执行catch语句中的脚本.

例子如下,包含文件错误抛出异常,代码如下:

<?php 
// 错误的演示 
try { 
require (&#39;test_try_catch.php&#39;); 
} catch (Exception $e) { 
echo $e->getMessage(); 
} 
 
// 正确的抛出异常 
try { 
if (file_exists(&#39;test_try_catch.php&#39;)) { 
require (&#39;test_try_catch.php&#39;); 
} else { 
throw new Exception(&#39;file is not exists&#39;); 
} 
} 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;          //为对象中的成员属性赋值 
        } 
    } 
}

//示例1,在没有异常时,程序正常执行,try中的代码全部执行并不会执行任何catch区块 

try{ 
    $testObj =new TestException();           //使用默认参数创建异常的擦拭类对象 
    echo "********<br>";                     //没有抛出异常这条语句就会正常执行 
}catch(MyException $e){                      //捕获用户自定义的异常区块 
    echo "捕获自定义的异常:$e<br>";          //按自定义的方式输出异常消息 
    $e->customFunction();                    //可以调用自定义的异常处理方法 
}catch(Exception $e){                        //捕获PHP内置的异常处理类的对象 
    echo "捕获默认的异常:".$e->getMessage()."<br>";       //输出异常消息 
} 
var_dump($testObj);        //判断对象是否创建成功,如果没有任何异常,则创建成功 
//示例2,抛出自定义的异常,并通过自定义的异常处理类捕获这个异常并处理 
try{ 
    $testObj1 =new TestException(1);         //传1时,抛出自定义异常 
    echo "********<br>";                     //这个语句不会被执行 
}catch(MyException $e){                      //这个catch区块中的代码将被执行 
    echo "捕获自定义的异常:$e<br>";           
    $e->customFunction();                     
}catch(Exception $e){                        //这个catch区块不会执行 
    echo "捕获默认的异常:".$e->getMessage()."<br>";        
} 
var_dump($testObj1);        //有异常产生,这个对象没有创建成功

//示例2,抛出自内置的异常,并通过自定义的异常处理类捕获这个异常并处理 

try{ 
    $testObj2 =new TestException(2);         //传入2时,抛出内置异常 
    echo "********<br>";                     //这个语句不会被执行 
}catch(MyException $e){                      //这个catch区块中的代码将被执行 
    echo "捕获自定义的异常:$e<br>";           
    $e->customFunction();                     
}catch(Exception $e){                        //这个catch区块不会执行 
    echo "捕获默认的异常:".$e->getMessage()."<br>";        
} 
var_dump($testObj2);        //有异常产生,这个对象没有创建成功

在上面的代码中,可以使用两个异常处理类:一个是自定义的异常处理类MyException;另一个则是PHP中内置的异常处理类Exception,分别在try区块中创建测试类TestException的对象,并根据构造方法中提供的不同数字参数,抛出自定义异常类对象、内置的异常类对象和不抛出任何异常的情况,跳转到对应的catch区块中执行,如果没有异常发生,则不会进入任何一个catch块中执行,测试类TestException的对象创建成功.


教程地址:

欢迎转载!但请带上文章地址^^

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace("&nbsp;","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么判断有没有小数点php怎么判断有没有小数点Apr 20, 2022 pm 08:12 PM

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么查找字符串是第几位php怎么查找字符串是第几位Apr 22, 2022 pm 06:48 PM

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음