오류 및 예외
오류는 구문 오류와 같은 프로그램 자체의 오류를 이해할 수 있습니다. 예외는 프로그램이 예상대로 실행되지 않거나 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_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 CommandNotFoundException(sprintf('Command "%s" does not exist.', $name));
当错误类型为 E_USER_DEPRECATED
时,需要添加 @
5.3.
경고 오류
- 부적절한 위치가 표시되지만 스크립트는 계속 실행할 수 있습니다. - 부적절한 위치가 표시되지만 정도가 경고 오류보다 낮으면 스크립트를 계속 실행할 수 있습니다.
사용되지 않는 오류
- 이 사용은 권장되지 않으며 다음 단계에서 중단될 수 있습니다. 기본적으로 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!