谬误与异样
谬误,能够了解顺序自身的谬误,例如语法谬误。而异样则更倾向于顺序运转没有合乎预期或许没有合乎失常流程;关于 PHP 言语而言,解决谬误以及解决异样应用的机制齐全没有同,因而很容易让人孕育发生困惑。
例如,咱们心愿经过捕捉异样来解决除了数为 0 的状况,然而正在捕捉到异样以前,PHP 就触发了谬误。
try { $a = 5 / 0; } catch (Exception $e) { $e->getMessage(); $a = -1; // 经过异样来解决 $a 为 0 的状况,然而实际上,捕捉没有到该异样 } echo $a; // PHP Warning: Division by zero
也就是说,PHP 将除了数为 0 的状况当成为了谬误而触发,而没有会主动抛出异样,因而没法捕捉。相似的,正在不少状况下,PHP 都没方法主动抛出异样。只能经过 if - else 语句判别再连系 throw 办法来并手动抛出异样。
上述状况的发作,次要仍是由于异样机制是 PHP 向面向工具演进后失去的产品。而正在此以前 PHP 的报错次要仍是经过谬误机制,因而,正在不少状况下,PHP 的谬误要比异样更有代价。不外 PHP7 开端对立这二者,使谬误也能够像异样那样抛出(这局部内容将放正在异样局部解说)。
谬误级别
PHP 中的谬误可了解为 使剧本没有运转没有失常的状况,依据谬误级别从高到低可划分为五类
1.Parse error
或 Syntax Error
- 语法解析谬误,触发该谬误后,剧本齐全无奈运转;
2.Fatal Error
- 致命谬误,触发该谬误后,前面的剧本无奈持续执行;
3.Warning Error
- 呈现比拟没有失当之处,剧本可持续执行;
4.Notice Error
- 呈现没有失当之处,然而水平比 Warning Error 低,剧本可持续执行;
5.Deprecated Error
- 没有保举这么应用,将来可能会烧毁,剧本可持续执行;
默许状况下,PHP 触发谬误,并显示谬误的级别及对应的提醒。
Parse Error
示例 - 语句末端没有写分号
echo "abc" // PHP Parse error: syntax error, unexpected end of file, expecting ',' or ';
Fatal Error
示例 - 应用没有存正在的函数
echo "before\n"; foo(); echo "after"; // 本行无奈持续执行 // before // PHP Fatal error: Uncaught Error: Call to undefined function foo()
Warning Error 示例 - 引入没有存正在的文件
$a = "foo"; include('bar.php'); echo $a; // 顺序持续执行 // PHP Warning: include(bar.php): failed to open stream: No such file or directory ... // foo Notice Error 示例 - 输入没有存正在的变量 echo $foo; echo 12345; // PHP Notice: Undefined variable: foo // 12345
Deprecated Error
示例 - 正在一些字符串函数中传入数字而非字符串
strpos('12345', 3); // PHP Deprecated: strpos(): Non-string needles will be interpreted as strings in the future
除了了默许触发音讯外,用户也能够应用 set_error_handler 函数自界说谬误解决,年夜少数谬误类型均可以进行自界说解决,除了了 E_ERROR
、 E_PARSE
、 E_CORE_ERROR
、 E_CORE_WARNING
、 E_COMPILE_ERROR
、 E_COMPILE_WARNING
外。
set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed
示例
<?php // E_ALL - 解决全副谬误类型 set_error_handler('customError', E_ALL); /** * @param int $errno 谬误的级别 * @param string $errstr 谬误的信息 * @param string $errfile 谬误的文件名(可选) * @param string $errline 谬误发作的行号(可选) */ function customError(int $errno, string $errstr, string $errfile, string $errline) { echo sprintf('谬误音讯为 %s', $errstr); } $a = 5 / 0; // 谬误音讯为 Division by zero
用户也能够经过 trigger_error 函数来手动触发一个用户级此外谬误(E_USER_ERROR、E_USER_WARNING、E_USER_NOTICE、E_USER_DEPRECATED)。
function division($a, $b) { if($b == 0){ @trigger_error("0 不克不及作为除了数", E_USER_NOTICE); return -1; } return $a / $b; } echo division(10, 0);
与谬误无关的设置装备摆设
一些谬误解决相干的罕用设置装备摆设
● error_reporting
- 设置谬误的陈诉级别
● display_errors
- 能否显示谬误
● display_startup_error
- 能否显示 PHP 启动进程中的显示
● log_errors
- 设置能否将剧本运转的谬误信息记载到效劳器谬误日记或许 error_log 之中
《Modern PHP》提出了四个规定
● 肯定要让 PHP 陈诉谬误;
● 正在开发环境中要显示谬误;
● 正在消费环境中不克不及显示谬误;
● 正在开发环境以及消费环境中都要记载谬误;
开发环境保举设置装备摆设
display_errors = On display_startup_error = On error_reporting = -1 log_errors = On
消费环境保举设置装备摆设
display_errors = Off display_startup_error = Off ; 陈诉 Notice 之外的一切谬误 error_reporting = E_ALL & ~E_NOTICE log_errors = On
Symfony 编码标准相干
异样以及谬误音讯字符串必需应用 sprintf
来进行拼接;
throw new Co妹妹andNotFoundException(sprintf('Co妹妹and "%s" does not exist.', $name));
当谬误类型为 E_USER_DEPRECATED
时,需求增加 @
@trigger_error("foo", E_USER_DEPRECATED);
更多相干php常识,请拜访php教程!
以上就是剖析PHP谬误解决(外围特点)的具体内容,更多请存眷资源魔其它相干文章!
标签: php php开发教程 php开发资料 php开发自学
抱歉,评论功能暂时关闭!