PHP 핵심 기능 - 오류 처리

PHPz
풀어 주다: 2019-11-20 13:29:06
앞으로
1137명이 탐색했습니다.

오류 및 예외

오류는 구문 오류와 같은 프로그램 자체의 오류를 이해할 수 있습니다. 예외는 프로그램이 예상대로 실행되지 않거나 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(&#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에 기록할지 설정

"최신 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(&#39;Command "%s" does not exist.&#39;, $name));
로그인 후 복사

오류 유형이 E_USER_DEPRECATED인 경우 @

@trigger_error("foo", E_USER_DEPRECATED);
로그인 후 복사
을 추가해야 합니다.
관련 라벨:
php
원천:learnku.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿