오류 및 예외
오류는 구문 오류와 같은 프로그램 자체의 오류를 이해할 수 있습니다. 예외는 프로그램이 예상대로 실행되지 않거나 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가지 수준으로 나눌 수 있습니다. 클래스
● 구문 분석 오류 - 구문 분석 오류, 이 오류가 발생한 후 스크립트를 전혀 실행할 수 없습니다.
● 치명적인 오류, 이 오류가 발생한 후. , 후속 스크립트를 계속 실행할 수 없습니다.
●경고 오류 - 부적절한 일이 발생하면 스크립트가 계속 실행됩니다.
●알림 오류 - 부적절한 일이 발생하지만 경고 오류 수준보다 낮으면 스크립트가 실행됩니다.
●사용 중단됨 오류 - 이 사용은 권장되지 않으며 나중에 중단될 수 있습니다.
기본적으로 PHP는 오류를 발생시키고 오류 수준을 표시합니다. 그리고 해당 프롬프트.
구문 분석 오류 예 - 명령문 끝에 세미콜론이 없습니다.
echo "abc"
// PHP 구문 분석 오류: 구문 오류, 예기치 않은 파일 끝, ',' 또는 ';
치명적인 오류 예 - 존재하지 않는 함수 사용
echo "beforen";
foo();
echo "after"; // 이 줄은 계속 실행할 수 없습니다
//
// PHP 치명적인 오류: 포착되지 않은 오류: 정의되지 않은 함수 foo() 호출
경고 오류 예 - 존재하지 않는 파일 소개
$a = "foo";
include('bar. php') ;
echo $a; // 프로그램이 계속 실행됩니다
// PHP 경고: include(bar.php): 스트림을 열지 못했습니다: 해당 파일이나 디렉터리가 없습니다 ...
// foo
알림 오류 예 - 존재하지 않는 변수 출력
echo $foo;
echo 12345;
// PHP 알림: 정의되지 않은 변수: foo
// 12345
사용되지 않는 오류 예 - 일부 문자에서는 문자열 대신 숫자를 문자열 함수에 전달합니다.
strpos('12345', 3);
// PHP 지원 중단: strpos(): 문자열이 아닌 바늘은 앞으로 문자열로 해석됩니다.
기본 트리거 메시지 외에도 사용자는 다음을 사용할 수 있습니다. 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에 기록할지 설정
"최신 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인 경우 @
@trigger_error("foo", E_USER_DEPRECATED);