成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

PHP中錯誤和異常的應(yīng)用

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)PHP中錯誤和異常的應(yīng)用,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

目前創(chuàng)新互聯(lián)已為近千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站運營、企業(yè)網(wǎng)站設(shè)計、宜陽網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

PHP語言簡單的原因之一就是PHP的錯誤處理機制,隨著PHP語言越來越現(xiàn)代化,也出現(xiàn)了異常,這篇博文就是簡單說下錯誤和異常,以便系統(tǒng)的理解,另外對于任何一種語言來說,異常的存在是具備共性的,所以學(xué)習(xí)一門語言理解異常機制是必不可少的.

什么是錯誤

當(dāng)PHP語言遇到異常的情況(比如數(shù)據(jù)庫連接不上或者函數(shù)參數(shù)傳遞錯誤),則會報出一些錯誤,錯誤可以分為多種類型,除了E_ERROR和E_CORE_ERROR錯誤,其它錯誤不會終止程序運行.

PHP讓人覺得簡單的原因就在于程序不會頻繁的報錯,給人一種編寫流暢和方便的錯覺.

也正因為這個原因PHP程序的嚴謹性和準(zhǔn)確性差了不少,比如MySQL_fetch_array查詢遇到網(wǎng)絡(luò)錯誤返回FALSE的時候(程序沒有終止運行),假如調(diào)用程序認為查詢沒有匹配的數(shù)據(jù),則這個程序本質(zhì)是錯誤的.

通過 php.ini的指令 error_reporting或者動態(tài)調(diào)用 error_reporting()函數(shù)我們可以選擇報告什么類型的錯誤,通過 display_errors指令則可以控制錯誤是否在線輸出.而 error_log指令可以控制將錯誤輸出到日志中.

如何正確使用錯誤

不管是系統(tǒng)函數(shù)或者是自定義函數(shù),假如內(nèi)部遇到錯誤,如何告之調(diào)用者呢?一般是通過函數(shù)返回 TRUE或者 FALSE來表明.這種處理方式有幾個弊端:

● 調(diào)用者只知道發(fā)生了錯誤,但是返回的錯誤信息太少,且缺乏錯誤類型的說明

● 程序處理邏輯和錯誤處理混雜在一塊,產(chǎn)生的代碼會非常的不清晰.

一個小技巧: error_get_last()函數(shù)會返回最近錯誤產(chǎn)生的具體原因.

最佳實踐:

● set_error_handler()函數(shù)來托管所有的錯誤

● trigger_error()函數(shù)可以觸發(fā)自定義錯誤,可以用來在函數(shù)中代替 return 語句

● 將所有的錯誤輸出到日志中,同時定義錯誤類型

● 對用戶顯示錯誤,比如將錯誤以一種更友好的方式返回給用戶

● 生產(chǎn)環(huán)境下 display_errors指令要關(guān)閉,開發(fā)環(huán)境則該指令打開

老牌的PHP框架 Codeigniter處理錯誤的方式可以借鑒

function _error_handler($severity, $message, $filepath, $line)
{
    $is_error = (((E_ERROR | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR) & $severity) === $severity);
    //輸出500錯誤HTTP狀態(tài)碼
    if ($is_error) {
        set_status_header(500);
    }
    //對于不需要處理的錯誤則直接中斷
    if (($severity & error_reporting()) !== $severity) {
        return;
    }
    //將所有的錯誤記錄到日志中
    $_error =& load_class('Exceptions', 'core');
    $_error->log_exception($severity, $message, $filepath, $line);
    //友好的輸出所有錯誤
    if (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors'))){
        $_error->show_php_error($severity, $message, $filepath, $line);
    }
    //假如致命錯誤則直接退出
    if ($is_error) {
        exit(1);   
    }
}
set_error_handler('_error_handler');

什么是異常

異常也是一個錯誤,它具備以下的特點:

● 異??梢宰远x,SPL提供了很多類型的異常,你也可以擴展它

● 異常最常規(guī)的動作就是捕獲,這樣開發(fā)者就能根據(jù)具體的錯誤進行后續(xù)處理.比如可以根據(jù)異常的上下文給用戶返回友好的提示.或者繼續(xù)拋出一個異常,讓上游的程序去處理.假如還是沒有捕獲異常,那么程序就直接終止了.

● 異常另外個動作就是拋出,假如通過函數(shù)編寫業(yè)務(wù)邏輯,遇到意外的情況,可以直接扔出一個異常.

● 異??梢员淮a一層一層捕獲,假如最外層的程序還沒有捕獲,則代碼直接終止運行

● PHP中的異常假如不能捕獲,則作為致命錯誤寫入到系統(tǒng)錯誤日志中

通過直觀的代碼來說明下:

function inverse($x)
{
    if ($x < 10) {
        throw new Exception('x<10');
    } elseif ($x >= 10 and $x < 100) {
        throw new LogicException('x>=10 and x<100');
    }
    return $x;
}
try {
    echo inverse(2)."\n";
} catch (LogicException $e) {
    echo 'Caught LogicException: ', $e->getMessage(), "\n";
} catch (Exception $e) {
    echo 'Caught Exception: ', $e->getMessage(), "\n";
    throw $e;
}

異常的最佳實踐

● 異常可以讓代碼更加清晰,讓開發(fā)者專注于業(yè)務(wù)邏輯的編寫.

● 構(gòu)建可擴展的異常是非常有技術(shù)性的,難道SPL異常還做的不夠嗎?

● 捕獲異常應(yīng)該僅僅捕獲本層能處理的異常,對于不能處理的異常則讓上游的代碼處理.

PHP7中的異常

PHP7鼓勵使用異常來代替錯誤,但是不可能一下子推翻錯誤處理機制,需要兼容,所以只能慢慢過渡.

但是可以通過變通的方式來統(tǒng)一使用異常

● Error異常

PHP中定義了一個 Error異常,注意這個異常和 Exception是并列的,

當(dāng)打開嚴格模式的時候,PHP7中很多的錯誤是被 Error異常拋出的.這樣就能統(tǒng)一使用異常了.

declare (strict_types = 1);
function add(int $a, int $b)
{
    return $a + $b;
}
try {
    echo add("3", "4");
}
catch (TypeError $e) { //TypeError繼承自Error
    echo $e->getMessage();
}

ErrorException

ErrorException繼承自 Exception.

我們可以通過 set_error_handler()函數(shù)將所有的錯誤轉(zhuǎn)換成 ErrorException.這樣就能愉快的統(tǒng)一使用異常了.

上述就是小編為大家分享的PHP中錯誤和異常的應(yīng)用了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站題目:PHP中錯誤和異常的應(yīng)用
標(biāo)題來源:http://jinyejixie.com/article10/pdcido.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站、網(wǎng)站設(shè)計公司、服務(wù)器托管、響應(yīng)式網(wǎng)站、用戶體驗自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
甘肃省| 康平县| 岫岩| 郧西县| 溆浦县| 墨江| 陵川县| 新巴尔虎右旗| 临江市| 三原县| 蒙山县| 阜新市| 新沂市| 六枝特区| 扶沟县| 广灵县| 荥阳市| 昭苏县| 太康县| 洛川县| 正蓝旗| 新余市| 云安县| 石家庄市| 宜昌市| 罗田县| 邹平县| 河池市| 小金县| 高台县| 苏州市| 保康县| 即墨市| 山东省| 溧水县| 偏关县| 斗六市| 油尖旺区| 射洪县| 淄博市| 张掖市|