欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

php7中錯(cuò)誤與異常要如何處理-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān)php7中錯(cuò)誤與異常要如何處理的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過來看看吧。

在三都等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需策劃設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),營銷型網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站建設(shè),三都網(wǎng)站建設(shè)費(fèi)用合理。

錯(cuò)誤

錯(cuò)誤是寫程序中不可避免的,如何去發(fā)現(xiàn)定位錯(cuò)誤及改正更是一門學(xué)問。今天和大家聊聊php7之后的錯(cuò)誤與異常。

錯(cuò)誤的分類

一般錯(cuò)誤分為語法錯(cuò)誤、運(yùn)行時(shí)錯(cuò)誤、邏輯錯(cuò)誤。語法以及運(yùn)行時(shí)錯(cuò)誤很容易去排查,但邏輯錯(cuò)誤就不是那么簡單的了。鄙人在判斷的時(shí)候也有多次將比較運(yùn)算==寫成了賦值運(yùn)算=,像我這種就很難去發(fā)現(xiàn)。一般隨著經(jīng)驗(yàn)的豐富(踩坑踩多了),會(huì)越來越容易來找到邏輯錯(cuò)誤。

控制錯(cuò)誤的輸出

一般建議開發(fā)階段開啟錯(cuò)誤輸出方便及時(shí)發(fā)現(xiàn)錯(cuò)誤,上線階段為了安全性及美觀建議關(guān)閉錯(cuò)誤輸出。

php提供了一個(gè)參數(shù)display_errors用于控制錯(cuò)誤向?yàn)g覽器、cli的輸出。有兩種方式可以來修改它,通過修改php.ini文件或使用ini_set函數(shù)來設(shè)置。下面展示使用ini_set來設(shè)置屏蔽錯(cuò)誤輸出的代碼。

<?php
ini_set('display_errors', 0);

echo $a;
echo 0;
date();
echo 1;

該程序會(huì)正常輸出01,但不會(huì)輸出錯(cuò)誤信息。

錯(cuò)誤報(bào)告級(jí)別

一般分為4大類

  • parse語法錯(cuò)誤

  • error致命錯(cuò)誤

  • warning警告級(jí)別錯(cuò)誤

  • notice注意級(jí)別錯(cuò)誤

在php.ini配置文件中,有選項(xiàng)error_reporting,該選項(xiàng)用來控制輸出何種級(jí)別的錯(cuò)誤。常見的有E_ALL、E_WARNING、E_NOTICE。

可以通過函數(shù)error_reporting()來動(dòng)態(tài)控制錯(cuò)誤級(jí)別的輸出。

# 輸出所有級(jí)別錯(cuò)誤
error_reporting(E_ALL);
# 輸出所有級(jí)別除了E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);
# 輸出所有級(jí)別除了E_NOTICE和E_WARNING
error_reporting(E_ALL & ~(E_NOTICE | E_WARNING));

display_errors與error_reporting的區(qū)別

display_errors是用來控制錯(cuò)誤是否輸出,而error_reporting是用來控制輸出何種級(jí)別的錯(cuò)誤。通常他們會(huì)搭配使用

ini_set('display_errors', 0); // 關(guān)閉錯(cuò)誤輸出
error_reporting(E_ALL);  // 輸出所有級(jí)別的錯(cuò)誤信息

上面的配置一般是上線階段,屏蔽所有的錯(cuò)誤輸出,但是記錄錯(cuò)誤到php的錯(cuò)誤日志里。錯(cuò)誤日志的路徑是由選項(xiàng)error_log 決定的。

如果設(shè)置error_reporting為0值,則不輸出錯(cuò)誤也不記錄錯(cuò)誤日志。

錯(cuò)誤對(duì)于程序的影響

當(dāng)程序有語法錯(cuò)誤時(shí),程序是不會(huì)執(zhí)行的。當(dāng)有error級(jí)別的錯(cuò)誤時(shí),程序就會(huì)停止向下執(zhí)行。notice、及warning級(jí)別錯(cuò)誤時(shí)不會(huì)影響程序的向下執(zhí)行的。

error_reporting(E_ALL);  // 輸出所有級(jí)別的錯(cuò)誤信息

echo $a;
echo 0;
date();
echo 1;
new a;
echo 2;

該程序會(huì)輸出0和1,但不會(huì)輸出2。

用戶自定義錯(cuò)誤

trigger_error()函數(shù)可以生產(chǎn)一個(gè)用戶級(jí)別的錯(cuò)誤。錯(cuò)誤級(jí)別有E_USER_ERROR 、E_USER_WARNING、E_USER_NOTICE 等

<?php

trigger_error('這是notice級(jí)別錯(cuò)誤', E_USER_NOTICE);
trigger_error('warning錯(cuò)誤', E_USER_WARNING);
trigger_error('deprecated', E_USER_DEPRECATED);
trigger_error('error錯(cuò)誤', E_USER_ERROR);

自定義錯(cuò)誤處理

set_error_handler — 設(shè)置用戶自定義的錯(cuò)誤處理函數(shù),該函數(shù)原型如下:

set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed

該函數(shù)首個(gè)參數(shù)是一個(gè)回調(diào)函數(shù),原型如下:

handler ( int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] ) : bool
  • error 錯(cuò)誤級(jí)別

  • errstr 錯(cuò)誤信息

  • errfile 發(fā)送錯(cuò)誤的文件

  • errline 錯(cuò)誤出現(xiàn)的行號(hào)

以下級(jí)別的錯(cuò)誤不能由用戶定義的函數(shù)來處理:    E_ERROR、 E_PARSE、    E_CORE_ERROR、 E_CORE_WARNING、    E_COMPILE_ERROR、    E_COMPILE_WARNING,和在調(diào)用 set_error_handler() 函數(shù)所在文件中產(chǎn)生的大多數(shù) E_STRICT。

<?php
 
define('DEBUG', false);
 
set_error_handler('error_handler');
 
if (DEBUG) {
    ini_set('display_errors', 'On');
} else {
    ini_set('display_errors', 'Off');
}
 
function error_handler($errLevel, $errInfo, $errFile, $errLine)
{
    echo "ErrorLevel:$errLevel: $errInfo In $errFile ON $errLine" . PHP_EOL;
}
 
echo $a;

異常

異常和錯(cuò)誤時(shí)有區(qū)別的,錯(cuò)誤一般是指我們能控制的問題,比如變量名寫錯(cuò)了,或者判斷條件寫的不錯(cuò),導(dǎo)致死循環(huán)。而異常通常指那些難以控制的、意料外的錯(cuò)誤,比如mysql連接不上,文件句柄打開失敗等情況。

php的異常也是經(jīng)典的try catch finally,但和一般的異常處理不一樣的是,絕大部分的異常需要自行拋出。拋出異常使用throw關(guān)鍵字完成。php也支持捕獲多個(gè)異常。

<?php

class MyError extends Exception
{
    public function printErr ()
    {
        echo '出錯(cuò)啦'.PHP_EOL;
    }
}

class YourError extends Exception
{
    public function printErr ()
    {
        echo 'errors'.PHP_EOL;
    }
}

try {
    if (mt_rand(0,1)) {
        throw new MyError('錯(cuò)誤');
    } else {
        throw new YourError('錯(cuò)誤');
    }


} catch (MyError $e) {
    $e->printErr();
} catch (YourError $e) {
    $e->printErr();
} finally {
    echo '不管有沒有異常,我都會(huì)被執(zhí)行'.PHP_EOL;
}

php的異常如果沒有捕獲,則會(huì)報(bào)Fatal Error錯(cuò)誤,程序不會(huì)繼續(xù)向下執(zhí)行。

PHP 7 錯(cuò)誤處理

PHP 7 改變了大多數(shù)錯(cuò)誤的報(bào)告方式。不同于傳統(tǒng)(PHP 5)的錯(cuò)誤報(bào)告機(jī)制,現(xiàn)在大多數(shù)錯(cuò)誤被作為 Error 異常拋出。 Error 和 Exception 都實(shí)現(xiàn)了 Throwable 接口

異常處理

設(shè)置默認(rèn)的異常處理程序,有try/catch捕獲的話這個(gè)異常函數(shù)就不會(huì)執(zhí)行,反之就會(huì)執(zhí)行異常處理函數(shù),而且執(zhí)行的話,腳本將不會(huì)繼續(xù)執(zhí)行。

php使用set_exception_handler來設(shè)置用戶自定義的異常處理函數(shù)   ,函數(shù)原型如下:

set_exception_handler ( callable $exception_handler ) : callable

回調(diào)函數(shù)的原型如下:

handler ( Throwable $ex ) : void

下面,我們來寫一個(gè)異常處理函數(shù)

<?php

class MyError extends Exception
{
    public function printErr ()
    {
        echo '出錯(cuò)啦'.PHP_EOL;
    }
}

class YourError extends Exception
{
    public function printErr ()
    {
        echo 'errors'.PHP_EOL;
    }
}

try {
    if (mt_rand(0,1)) {
        throw new MyError('錯(cuò)誤');
    } else {
        throw new YourError('錯(cuò)誤');
    }


} catch (MyError $e) {
    $e->printErr();
} catch (YourError $e) {
    $e->printErr();
} finally {
    echo '不管有沒有異常,我都會(huì)被執(zhí)行'.PHP_EOL;
}

統(tǒng)一處理錯(cuò)誤與異常

學(xué)完了錯(cuò)誤與異常,知道如何去使用自定義錯(cuò)誤處理和異常處理,現(xiàn)在我們就可以統(tǒng)一處理錯(cuò)誤與異常了。

<?php
 
class Errors
{
    // 處理非致命錯(cuò)誤
    static function errorHandle($errLevel, $errInfo, $errFile, $errLine)
    {
        echo '錯(cuò)誤:'.PHP_EOL;
        print_r(['file' => $errFile, 'level' => $errLevel, 'line' => $errLine, 'info' => $errInfo]);
    }
 
    // 處理致命錯(cuò)誤及異常
    static function exceptionHandle(Throwable $ex)
    {
        echo '異常:'.PHP_EOL;
        print_r(['file' => $ex->getFile(), 'level' => $ex->getCode(), 'line' => $ex->getLine(), 'info' => $ex->getMessage()]);
    }
}
 
set_error_handler(['Errors', 'errorHandle']);
set_exception_handler(['Errors', 'exceptionHandle']);

感謝各位的閱讀!關(guān)于php7中錯(cuò)誤與異常要如何處理就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

本文標(biāo)題:php7中錯(cuò)誤與異常要如何處理-創(chuàng)新互聯(lián)
文章起源:http://chinadenli.net/article24/dhodje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站網(wǎng)站營銷網(wǎng)站收錄搜索引擎優(yōu)化網(wǎng)站制作建站公司

廣告

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

成都定制網(wǎng)站建設(shè)