真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

php7中怎么對(duì)異常與錯(cuò)誤進(jìn)行處理

php7中怎么對(duì)異常與錯(cuò)誤進(jìn)行處理,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

安龍網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián),安龍網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為安龍1000多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的安龍做網(wǎng)站的公司定做!

什么叫做異常?

異常是指程序運(yùn)行中不符合預(yù)期情況以及與正常流程不同的狀況。

比如你鏈接數(shù)據(jù)庫(kù),在參數(shù)都寫上去的條件下,發(fā)現(xiàn)鏈接不上去,這就屬于不符合預(yù)期

可以被 try-catch 捕捉得到

什么叫做錯(cuò)誤?

是屬于php程序自身的問(wèn)題,一般是由非法的語(yǔ)法,環(huán)境問(wèn)題導(dǎo)致的,使得編譯器無(wú)法通過(guò)檢查,甚至無(wú)法運(yùn)行的情況。
平時(shí)遇到的 warming、notice都是錯(cuò)誤,只是級(jí)別不同而已。

例如:

  • TypeError(類型錯(cuò)誤) 我規(guī)定的函數(shù)參數(shù)類型和傳入的參數(shù)不一致

  • ArithmeticError (算數(shù)錯(cuò)誤)

  • ParseError (解析錯(cuò)誤)在調(diào)入的文件中,include "demo.php",或者 eval();中有語(yǔ)法錯(cuò)誤造成解析失敗

  • AssertionError(斷言錯(cuò)誤)當(dāng)assert生效時(shí)產(chǎn)生該錯(cuò)誤

  • DivisionByZeroError (分母為零) 運(yùn)算過(guò)程中例如除法,分母為0

除了這幾種情況,其余全部為異常

異常處理

在以前的 php5.X 中 并且不能被 try-catch 捕捉得到,到了 php 7.x 中,定義了一個(gè) Throwable 接口 并使得大部分的 Error 和
Exception 實(shí)現(xiàn)了該接口,我們得以在 try-catch 中拋出該錯(cuò)誤

所以說(shuō)以后想要捕獲異常,而你又不知道此異常是 Error 還是 Exception 的話,可以向這樣拋出

try{
    ……
}catch(Throwable $e){
    ……
}

錯(cuò)誤的級(jí)別

在 php 中的錯(cuò)誤也是有級(jí)別的

Parse error >Fatal Error > Waning > Notice > Deprecated

Deprecated 最低級(jí)別的錯(cuò)誤(不推薦,不建議)
使用一些過(guò)期函數(shù)的時(shí)候會(huì)出現(xiàn),程序繼續(xù)執(zhí)行

Notice 通知級(jí)別的錯(cuò)誤
使用一些未定義變量、常量或者數(shù)組key沒(méi)有加引號(hào)的時(shí)候會(huì)出現(xiàn),程序繼續(xù)執(zhí)行
        E_NOTICE      // 運(yùn)行時(shí)通知。表示腳本遇到可能會(huì)表現(xiàn)為錯(cuò)誤的情況.
        E_USER_NOTICE // 用戶產(chǎn)生的通知信息。
        
Waning 警告級(jí)別的錯(cuò)誤
程序出問(wèn)題了,需要修改代碼!?。〕绦蚶^續(xù)執(zhí)行
        E_WARNING         // 運(yùn)行時(shí)警告 (非致命錯(cuò)誤)。
        E_CORE_WARNING    // PHP初始化啟動(dòng)過(guò)程中發(fā)生的警告 (非致命錯(cuò)誤) 。
        E_COMPILE_WARNING // 編譯警告
        E_USER_WARNING    // 用戶產(chǎn)生的警告信息
        
Fatal Error 錯(cuò)誤級(jí)別的錯(cuò)誤
程序直接報(bào)錯(cuò),需要修改代碼?。?!中斷程序執(zhí)行,可使用register_shutdown_function()函數(shù)在程序終止前觸發(fā)一個(gè)函數(shù)
        E_ERROR         // 致命的運(yùn)行錯(cuò)誤,錯(cuò)誤無(wú)法恢復(fù),暫停執(zhí)行腳本
        E_CORE_ERROR    // PHP啟動(dòng)時(shí)初始化過(guò)程中的致命錯(cuò)誤
        E_COMPILE_ERROR // 編譯時(shí)致命性錯(cuò),就像由Zend腳本引擎生成了一個(gè)E_ERROR
        E_USER_ERROR    // 自定義錯(cuò)誤消息。像用PHP函數(shù)trigger_error(錯(cuò)誤類型設(shè)置為:E_USER_ERROR)
        
Parse error 語(yǔ)法解析錯(cuò)誤
語(yǔ)法檢查階段報(bào)錯(cuò),需要修改代碼?。?!中斷程序執(zhí)行,除了修改ini文件,將錯(cuò)誤信息寫到日志中,什么也做不了
        E_PARSE  //編譯時(shí)的語(yǔ)法解析錯(cuò)誤

自定義錯(cuò)誤處理程序

有的時(shí)候,php 中自帶的錯(cuò)誤處理程序,并不能完全滿足我們得需要,大部分時(shí)候,我們都需要手動(dòng)重寫異常處理。

php 給我們提供了三個(gè)函數(shù)來(lái)幫助我們來(lái)處理,分別是

set_error_handler()

  • 函數(shù)來(lái)托管錯(cuò)誤處理程序,可自行定制錯(cuò)誤的處理流程。

  • 如果此函數(shù)之前的代碼發(fā)生錯(cuò)誤,那么不會(huì)調(diào)用我們自定義的處理函數(shù),因?yàn)檫€未注冊(cè)

  • 設(shè)置此函數(shù)后 error_reporting() 將會(huì)失效

  • 以下級(jí)別的錯(cuò)誤不能由用戶定義的函數(shù)來(lái)處理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING 該函數(shù)只能捕捉我們的 部分 Warning 和 Note 級(jí)別的錯(cuò)誤

set_exception_handler()

  • 用于沒(méi)有被捕獲的異常處理

register_shutdown_function()

  • 作用:注冊(cè)一個(gè)會(huì)在php中止時(shí)執(zhí)行的函數(shù)

  • 捕獲PHP的錯(cuò)誤:Fatal Error、Parse Error等,這個(gè)方法是PHP腳本執(zhí)行結(jié)束前最后一個(gè)調(diào)用的函數(shù),比如腳本錯(cuò)誤、die()、exit、異常、正常結(jié)束都會(huì)調(diào)用,

  • 如果拿來(lái)用錯(cuò)誤處理的時(shí)候,需要配合error_get_last() 它能獲取最后發(fā)生的錯(cuò)誤。

// 舉例:
register_shutdown_function('shutdown');

function shutdown()
{
    if ($error = error_get_last()) {
        var_dump($error);
    }
}
$name   //沒(méi)寫 ; 號(hào)

執(zhí)行結(jié)果
Parse error: syntax error, unexpected ';' in /app/swoole/errorDemo.php on line 34
Emmmmm 這不扯淡嗎? 分明分明沒(méi)有執(zhí)行呢?

其實(shí)原因使因?yàn)?,程序?zhí)行前,我們 php 會(huì)先檢查我們程序的語(yǔ)法問(wèn)題,如果沒(méi)有問(wèn)題,我們才能執(zhí)行我們的程序。

我們上面的代碼沒(méi)用通過(guò)我們的語(yǔ)法檢查,所以直接報(bào)錯(cuò)。

那么問(wèn)題來(lái)了? 我們?cè)诳蚣苤械臅r(shí)候,為什么是框架都是框架給我們報(bào)錯(cuò)呢?

框架的錯(cuò)誤處理

在框架中,其代碼是通過(guò)一個(gè)入口文件來(lái)加載的。而我們php檢測(cè)語(yǔ)法錯(cuò)誤的時(shí)候,只檢查我們的 index.php 有沒(méi)有錯(cuò)誤, require 文件中的代碼是不會(huì)受到檢測(cè)的。在Index.php 文件中通常會(huì)定義一些錯(cuò)誤異常的處理。當(dāng)我們代碼出錯(cuò)時(shí),那是在 run-time 中檢測(cè)的錯(cuò)誤,我們的框架可以根據(jù)我們編寫的錯(cuò)誤異常自行做出處理。

下面我們舉個(gè)例子 在 ThinkPHP5中的異常處理

// [ 應(yīng)用入口文件 ]  index.php
namespace think;

// 加載基礎(chǔ)文件
require __DIR__ . '/../thinkphp/base.php';

// 支持事先使用靜態(tài)方法設(shè)置Request對(duì)象和Config對(duì)象

// 執(zhí)行應(yīng)用并響應(yīng)
Container::get('app')->run()->send();

在我們的入口文件中,加載了 base.php 在這個(gè)文件中,TP 定義了自己的異常處理

// 載入Loader類
require __DIR__ . '/library/think/Loader.php';

// 注冊(cè)自動(dòng)加載
Loader::register();

// 注冊(cè)錯(cuò)誤和異常處理機(jī)制
Error::register();

// 實(shí)現(xiàn)日志接口
if (interface_exists('Psr\Log\LoggerInterface')) {
   //doSomething
}

// 注冊(cè)類庫(kù)別名
Loader::addClassAlias([
   //doSomething
]);
/**
     * 注冊(cè)異常處理
     * @access public
     * @return void
     */
    public static function register()
    {
        error_reporting(E_ALL);
        set_error_handler([__CLASS__, 'appError']);
        set_exception_handler([__CLASS__, 'appException']);
        register_shutdown_function([__CLASS__, 'appShutdown']);
    }

關(guān)于php7中怎么對(duì)異常與錯(cuò)誤進(jìn)行處理問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。


標(biāo)題名稱:php7中怎么對(duì)異常與錯(cuò)誤進(jìn)行處理
分享URL:http://weahome.cn/article/pcgooj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部