溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何理解PHP中的異常處理情況

發(fā)布時(shí)間:2021-10-21 09:59:33 來源:億速云 閱讀:183 作者:iii 欄目:編程語言

本篇內(nèi)容介紹了“如何理解PHP中的異常處理情況”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

如何理解PHP中的異常處理情況

PHP中的錯(cuò)誤和異常處理在PHP中是非常常用的,在我們的日常開發(fā)中,肯定會(huì)遇到比如忘記加分號(hào)了、函數(shù)名寫錯(cuò)或者函數(shù)被重新定義了等等很多的錯(cuò)誤,如果說在開發(fā)過程中,能夠發(fā)現(xiàn)錯(cuò)誤顯示錯(cuò)誤,那肯定對(duì)我們的開發(fā)是十分有利的。

因此,在開發(fā)項(xiàng)目的時(shí)候合理使用一場處理,會(huì)有助于我們發(fā)現(xiàn)錯(cuò)誤改正錯(cuò)誤以加快開發(fā)速度。那接下來我們就一起來看一看應(yīng)該怎樣去了解我們的錯(cuò)誤處理。

PHP中的異常處理類

在PHP中就提供了內(nèi)置的異常處理類,也就是Exception,這個(gè)類包含了一些處理異常的函數(shù),這些函數(shù)可以捕獲程序異常和錯(cuò)誤。

那下面列舉出該類中較為常用的函數(shù):

  • getTraceAsString():返回已格式化成字符串的、由函數(shù) getTrace() 函數(shù)所產(chǎn)生的信息

  • __toString():產(chǎn)生異常的字符串信息,它可以重載。注意,該函數(shù)最前部是兩個(gè)下劃線

  • getMessage():返回異常的消息內(nèi)容

  • getLine():返回發(fā)生錯(cuò)誤的代碼行號(hào)

  • getCode():以數(shù)字形式返回異常代碼

  • getFile():返回發(fā)生異常的文件名

  • getTrace():返回 backtrace() 數(shù)組

捕獲程序中的異常

程序中的異常出現(xiàn)一般不會(huì)自己顯現(xiàn)出來,這時(shí)候我們可以通過try catch 語句和 throw 關(guān)鍵字,來達(dá)到捕捉程序中異常的目的。

try catch語句和流程控制的語句類似,throw關(guān)鍵字可以拋出一個(gè)異常,我們可以通過類似條件選擇的結(jié)構(gòu)來完成捕獲程序中的異常。try catch語句的語法格式如下:

try{
    // 可能出現(xiàn)異?;蝈e(cuò)誤的代碼,比如文件操作、數(shù)據(jù)庫操作等
}catch(Exception $a){    // $a 為一個(gè)異常類的對(duì)象
    // 輸出錯(cuò)誤信息
}

在我們需要進(jìn)行捕捉程序異常時(shí),需要把需要捕捉的代碼放入try代碼塊里面,在上述語法中,每一個(gè)try應(yīng)該至少有一個(gè)與之對(duì)應(yīng)的catch。當(dāng)try代碼塊沒有catch匹配的異常時(shí),代碼就會(huì)跳轉(zhuǎn)到最后一個(gè)catch后面繼續(xù)進(jìn)行。

在其中產(chǎn)生的異常都可以被throw語句跑出來并且被catch捕獲,當(dāng)有一個(gè)異常出現(xiàn)的時(shí)候,在其后面的代碼就不會(huì)再繼續(xù)執(zhí)行了。

示例如下:

<?php
    try{
        $err = '拋出異常信息,并跳出 try 語句塊';
        if(is_dir('./demo')){
            echo '這里是一些可能會(huì)發(fā)生異常的代碼';
        }else{
            throw new Exception($err, 20211020);   // 拋出異常
        }
        echo '上面拋出異常的話,這行代碼將不會(huì)執(zhí)行,轉(zhuǎn)而執(zhí)行 catch 中的代碼。<br>';
    }catch(Exception $e){
        echo '捕獲異常:'.$e->getMessage().'<br>錯(cuò)誤代碼:'.$e->getCode().'<br>';
    }
    echo '繼續(xù)執(zhí)行 try catch 語句之外的代碼';
?>

輸出結(jié)果:

如何理解PHP中的異常處理情況

再上述示例中,通過try語句試圖判斷當(dāng)前目錄下有沒有名為demo的目錄,目錄不存在,所以執(zhí)行了throw關(guān)鍵字拋出異常。異常發(fā)現(xiàn)拋出后,try語句的剩下語句就不會(huì)在運(yùn)行了。

創(chuàng)建自己的異常類

PHP中可以事先定義一些異常,因?yàn)镻HP中很少會(huì)主動(dòng)的拋出異常,當(dāng)事先定義好異常后,我們可以通過if-else來對(duì)可能出現(xiàn)的異常進(jìn)行判斷,手動(dòng)來拋出異常,再PHP中經(jīng)常能夠使用到我們自己創(chuàng)建的異常類。

示例如下:

<?php
class emailException extends Exception{
    function __toString(){
        return "<b>email is null</b>file:".$this->getFile().',line:'. $this->getLine();
    }
}
class nameException extends Exception{
}
?>

上述示例中,定義了兩個(gè)異常類,都繼承自 Exception 基類。

在實(shí)際的業(yè)務(wù)中,我們也會(huì)根據(jù)不同的需求來拋出不同的異常,示例如下:

function reg($reg) {
    if (empty($reg['email'])) {
        throw new emailException("emaill is null", 1);
    }
    if(empty($reg['name'])) {
        throw new nameException("name is null", 2);
     }
}

在執(zhí)行業(yè)務(wù)代碼時(shí),可以使用if語句來判斷異常會(huì)發(fā)生的地方,然后手動(dòng)拋出異常,通過語句實(shí)現(xiàn)將不同的異常分發(fā)給不同的異常類處理;再下面這段示例中,根據(jù)不同的情況捕獲不同的異常,當(dāng)?shù)谝粋€(gè)catch捕獲了異常,即使程序中依然存在其他異常,也會(huì)跳過其他的catch代碼塊。無論程序中有沒有出現(xiàn)異常,最后的finally中的語句都會(huì)執(zhí)行的。示例如下:

try{
    $reg = array('phone'=>'1888888888');
    reg($reg);
} catch(emailException $e) {
    echo $e;
} catch(nameException $e) {
    echo 'error msg:' .$e->getMessage().'error code:'.$e->getCode();
} finally {
    echo ' finally';
}

“如何理解PHP中的異常處理情況”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI