首頁 php教程 php手册 php中try catch 捕获异常的例

php中try catch 捕获异常的例

May 26, 2016 am 08:21 AM
catch php try

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

我後悔之前不知道的 7 個 PHP 函數 我後悔之前不知道的 7 個 PHP 函數 Nov 13, 2024 am 09:42 AM

如果您是經驗豐富的PHP 開發人員,您可能會感覺您已經在那裡並且已經完成了。操作

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

See all articles