php7的错误与异常处理-PHP7

资源魔 115 0

谬误

谬误是写顺序中不成防止的,若何去发现定位谬误及矫正更是一门学识。明天以及各人聊聊php7之后的谬误与异样。

谬误的分类

普通谬误分为语法谬误、运转时谬误、逻辑谬误。语法和运转时谬误很容易去排查,但逻辑谬误就没有是那末简略的了。不才正在判别的时分也有屡次将比拟运算==写成为了赋值运算=,像我这类就很难去发现。普通跟着经历的丰厚(踩坑踩多了),会愈来愈容易来找到逻辑谬误。

管制谬误的输入

普通倡议开发阶段开启谬误输入不便实时发现谬误,上线阶段为了平安性及雅观倡议封闭谬误输入。

php提供了一个参数display_errors用于管制谬误向阅读器、cli的输入。有两种形式能够来修正它,经过修正php.ini文件或应用ini_set函数来设置。上面展现应用ini_set来设置屏蔽谬误输入的代码。

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

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

该顺序会失常输入01,但没有会输入谬误信息。

谬误陈诉级别

普通分为4年夜类

  • parse语法谬误

  • error致命谬误

  • warning正告级别谬误

  • notice留意级别谬误

正在php.ini设置装备摆设文件中,有选项error_reporting,该选项用来管制输入何种级此外谬误。常见的有E_ALL、E_WARNING、E_NOTICE。

能够经过函数error_reporting()来静态管制谬误级此外输入。

# 输入一切级别谬误
error_reporting(E_ALL);
# 输入一切级别除了了E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);
# 输入一切级别除了了E_NOTICE以及E_WARNING
error_reporting(E_ALL & ~(E_NOTICE | E_WARNING));

display_errors与error_reporting的区分

display_errors是用来管制谬误能否输入,而error_reporting是用来管制输入何种级此外谬误。通常他们会搭配应用

ini_set('display_errors', 0); // 封闭谬误输入
error_reporting(E_ALL);  // 输入一切级此外谬误信息

下面的设置装备摆设普通是上线阶段,屏蔽一切的谬误输入,然而记载谬误到php的谬误日记里。谬误日记的门路是由选项error_log 决议的。

假如设置error_reporting为0值,则没有输入谬误也没有记载谬误日记。

谬误关于顺序的影响

当顺序有语法谬误时,顺序是没有会执行的。当有error级此外谬误时,顺序就会中止向下执行。notice、及warning级别谬误时没有会影响顺序的向下执行的。

error_reporting(E_ALL);  // 输入一切级此外谬误信息

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

该顺序会输入0以及1,但没有会输入2。

用户自界说谬误

trigger_error()函数能够消费一个用户级此外谬误。谬误级别有E_USER_ERROR 、E_USER_WARNING、E_USER_NOTICE 等

<?php

trigger_error('这是notice级别谬误', E_USER_NOTICE);
trigger_error('warning谬误', E_USER_WARNING);
trigger_error('deprecated', E_USER_DEPRECATED);
trigger_error('error谬误', E_USER_ERROR);

自界说谬误解决

set_error_handler — 设置用户自界说的谬误解决函数,该函数原型以下:

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

该函数首个参数是一个回调函数,原型以下:

handler ( int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] ) : bool
  • error 谬误级别

  • errstr 谬误信息

  • errfile 发送谬误的文件

  • errline 谬误呈现的行号

如下级此外谬误不克不及由用户界说的函数来解决: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,以及正在挪用 set_error_handler() 函数所正在文件中孕育发生的年夜少数 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;

异样

异样以及谬误时有区分的,谬误普通是指咱们能管制的成绩,比方变量名写错了,或许判别前提写的没有错,招致死轮回。而异样通常指那些难以管制的、预料外的谬误,比方mysql衔接没有上,文件句柄关上失败等状况。

php的异样也是经典的try catch finally,但以及普通的异样解决纷歧样的是,绝年夜局部的异样需求自行抛出。抛出异样应用throw要害字实现。php也支持捕捉多个异样。

<?php

class MyError extends Exception
{
    public function printErr ()
    {
        echo '犯错啦'.PHP_EOL;
    }
}

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

try {
    if (mt_rand(0,1)) {
        throw new MyError('谬误');
    } else {
        throw new YourError('谬误');
    }


} catch (MyError $e) {
    $e->printErr();
} catch (YourError $e) {
    $e->printErr();
} finally {
    echo '不论有无异样,我城市被执行'.PHP_EOL;
}

php的异样假如不捕捉,则会报Fatal Error谬误,顺序没有会持续向下执行。

PHP 7 谬误解决

PHP 7 扭转了年夜少数谬误的陈诉形式。没有同于传统(PHP 5)的谬误陈诉机制,如今年夜少数谬误被作为 Error 异样抛出。 Error 以及 Exception 都完成了 Throwable 接口

异样解决

设置默许的异样解决顺序,有try/catch捕捉的话这个异样函数就没有会执行,反之就会执行异样解决函数,并且执行的话,剧本将没有会持续执行。

php应用set_exception_handler来设置用户自界说的异样解决函数 ,函数原型以下:

set_exception_handler ( callable $exception_handler ) : callable

回调函数的原型以下:

handler ( Throwable $ex ) : void

上面,咱们来写一个异样解决函数

<?php

class MyError extends Exception
{
    public function printErr ()
    {
        echo '犯错啦'.PHP_EOL;
    }
}

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

try {
    if (mt_rand(0,1)) {
        throw new MyError('谬误');
    } else {
        throw new YourError('谬误');
    }


} catch (MyError $e) {
    $e->printErr();
} catch (YourError $e) {
    $e->printErr();
} finally {
    echo '不论有无异样,我城市被执行'.PHP_EOL;
}

对立解决谬误与异样

学完了谬误与异样,晓得若何去应用自界说谬误解决以及异样解决,如今咱们就能够对立解决谬误与异样了。

<?php
 
class Errors
{
    // 解决非致命谬误
    static function errorHandle($errLevel, $errInfo, $errFile, $errLine)
    {
        echo '谬误:'.PHP_EOL;
        print_r(['file' => $errFile, 'level' => $errLevel, 'line' => $errLine, 'info' => $errInfo]);
    }
 
    // 解决致命谬误及异样
    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']);

以上就是php7的谬误与异样解决的具体内容,更多请存眷资源魔其它相干文章!

标签: PHP7 php7开发教程 php7开发资料 php7开发自学

抱歉,评论功能暂时关闭!