>  기사  >  백엔드 개발  >  PHP 오류 처리 분석(핵심 기능)

PHP 오류 처리 분석(핵심 기능)

藏色散人
藏色散人앞으로
2020-01-26 13:35:402104검색

PHP 오류 처리 분석(핵심 기능)

오류 및 예외

오류는 구문 오류와 같은 프로그램 자체의 오류를 이해할 수 있습니다. 예외는 프로그램이 예상대로 실행되지 않거나 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의 오류는 스크립트가 제대로 실행되지 않는 비정상적인 상황으로 이해될 수 있으며 오류 수준에 따라 높은 수준부터 낮은 수준까지 5가지 범주로 나눌 수 있습니다

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_ERRORE_PARSEE_CORE_ERRORE_CORE_WARNINGE_COMPILE_ERRORE_COMPILE_WARNING 外。

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

 

示例

<?php
// E_ALL - 处理全部错误类型
set_error_handler(&#39;customError&#39;, 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(&#39;错误消息为 %s&#39;, $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 CommandNotFoundException(sprintf('Command "%s" does not exist.', $name));

当错误类型为 E_USER_DEPRECATED 时,需要添加 @

2 - 치명적인 오류, 이 오류가 발생한 후 다음 스크립트를 계속 실행할 수 없습니다.

3.경고 오류 - 부적절한 위치가 표시되지만 스크립트는 계속 실행할 수 있습니다. - 부적절한 위치가 표시되지만 정도가 경고 오류보다 낮으면 스크립트를 계속 실행할 수 있습니다.

5.사용되지 않는 오류 - 이 사용은 권장되지 않으며 다음 단계에서 중단될 수 있습니다.

기본적으로 PHP는 오류를 발생시키고 오류 수준과 해당 프롬프트를 표시합니다.

구문 분석 오류 예 - 명령문 끝에 세미콜론이 없습니다. 🎜rrreee🎜 🎜🎜치명적인 오류 예 - 존재하지 않는 함수 사용 🎜rrreee🎜 🎜🎜경고 오류 예 - 소개 존재하지 않는 파일🎜rrreee🎜🎜🎜사용되지 않는 오류예 - 일부 문자열 함수에서 문자열 대신 숫자 전달🎜rrreee🎜🎜🎜기본 트리거 메시지 외에도 사용자는 다음을 사용할 수도 있습니다. set_error_handler 함수 사용자 정의 오류 처리. E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING을 제외한 대부분의 오류 유형을 사용자 정의할 수 있습니다. 코드>, E_COMPILE_ERROR, E_COMPILE_WARNING. 🎜rrreee🎜 🎜🎜Example🎜rrreee🎜 🎜🎜사용자는 Trigger_error 함수를 통해 사용자 수준 오류(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE, E_USER_DEPRECATED)를 수동으로 트리거할 수도 있습니다. 🎜rrreee🎜🎜🎜🎜🎜🎜오류 관련 구성🎜🎜🎜오류 처리와 관련된 몇 가지 일반적인 구성🎜🎜● error_reporting - 오류 보고 수준 설정🎜🎜● display_errors - 오류 표시 여부🎜🎜● display_startup_error - PHP 시작 과정에서 표시 여부🎜🎜● log_errors - 실행 중인 스크립트의 오류 정보를 서버에 기록할지 여부 설정 오류 로그 또는 error_log에서 🎜🎜 "Modern PHP"는 네 가지 규칙을 제시합니다. 🎜🎜● PHP에서 오류를 보고하도록 하세요. 🎜🎜● 오류는 개발 환경에서 표시되어야 합니다. 🎜🎜● 오류는 프로덕션 환경에서 표시될 수 없습니다. ; 🎜🎜● 오류는 개발 환경과 프로덕션 환경 모두에서 기록되어야 합니다. 🎜🎜개발 환경에 대한 권장 구성🎜rrreee🎜🎜🎜프로덕션 환경에 대한 권장 구성🎜rrreee🎜🎜🎜🎜Symfony 코딩 표준 관련🎜🎜🎜예외 및 오류 메시지 문자열 연결하려면 sprintf 를 사용해야 합니다. 🎜🎜🎜throw new CommandNotFoundException(sprintf('Command "%s" does not 존재하지 않습니다.', $name));🎜🎜🎜오류 유형이 인 경우 E_USER_DEPRECATED, @를 추가해야 합니다🎜🎜🎜@trigger_error("foo", E_USER_DEPRECATED);🎜🎜🎜더 많은 관련 PHP 지식을 보려면 🎜php 튜토리얼🎜을 방문하세요! 🎜

위 내용은 PHP 오류 처리 분석(핵심 기능)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제