> 类库下载 > PHP类库 > PHP 오류 및 예외 요약

PHP 오류 및 예외 요약

高洛峰
풀어 주다: 2016-10-20 14:07:17
원래의
1318명이 탐색했습니다.

오류

오류 수준

치명적인 오류: 치명적인 오류(스크립트 실행 종료)

E_ERROR 치명적인 런타임 치명적인 오류, 프로그램 실행 종료
E_CORE_ERROR 다음과 같은 경우 치명적인 오류 PHP 시작
E_COMPILE_ERROR PHP 컴파일 시 치명적인 오류
E_USER_ERROR 사용자에 의해 생성된 치명적인 오류

구문 분석 오류: 컴파일 중 구문 분석 오류(스크립트 실행 종료)

구문 분석 오류 컴파일 중 구문 분석 오류

경고 오류: 경고 오류(프롬프트 정보만 제공되지만 스크립트는 작업을 종료하지 않습니다.)

E_WARNING 런타임 경고(치명적이지 않은 오류) ).
E_CORE_WARNING PHP 초기화 시작 중에 발생하는 경고(치명적이지 않은 오류)입니다.
E_COMPILE_WARNING 컴파일 경고
E_USER_WARNING 사용자 생성 경고 메시지

알림 오류: 알림 오류(알림 정보만 제공되지만 스크립트는 작업을 종료하지 않습니다.)

E_NOTICE 런타임 알림. 스크립트에서 오류로 나타날 수 있는 상황이 발생했음을 나타냅니다.
E_USER_NOTICE 사용자가 생성한 알림 정보입니다.

set_error_handler()는 오류를 캡처합니다[제한 있음]

함수 설명

set_error_handler($callback);//An을 처리할 사용자 함수(error_handler) 설정 스크립트에서 오류가 발생했습니다.

함수 제한

다음 수준의 오류는 사용자 정의 함수로 처리할 수 없습니다: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING 및 set_error_handler() 호출 시 대부분의 E_STRICT는 함수가 있는 파일에서 생성됩니다.

즉, set_error_handler($callback)는 시스템에서 생성된 일부 경고 및 알림 수준 오류만 캡처할 수 있습니다.

사용 방법

<?phpset_error_handler("error_handler");function error_handler($errno,$errstr,$errfile,$errline){    $str=<<<EOF         "errno":$errno
         "errstr":$errstr
         "errfile":$errfile
         "errline":$errlineEOF;
//获取到错误可以自己处理,比如记Log、报警等等    echo $str;
}echo $test;//$test未定义,会报一个notice级别的错误
로그인 후 복사

출력 결과:

"errno":8"errstr":Undefined variable: test"errfile":/Users/shuchao/Desktop/handler.php"errline":13
如何捕获PHP的Fatal Error、Parse Error等
로그인 후 복사

요구 사항 설명

PHP의 치명적인 오류를 가져옵니다. 도움이 되는 로그 온라인 문제를 분석하고 온라인 서비스를 모니터링할 수 있습니다.

함수 2개

register_shutdown_function()

register_shutdown_function($callback)

register_shutdown_function(), 등록하고 싶은 함수만 넣어주세요 [큐인 척]에서 스크립트가 정상적으로 종료될 때까지 기다리거나 종료 호출을 표시한 다음 등록된 함수를 꺼내 실행합니다.

register_shutdown_function()이 호출되는 세 가지 상황:

스크립트가 정상적으로 종료될 때

오류로 스크립트가 종료될 때(파싱 시간이 아닌 런타임)

사용자가 종료 메소드를 호출할 때.

error_get_last()

error_get_last(); // 마지막으로 발생한 오류를 가져오는 함수입니다.

최근 발생한 오류를 배열 형태로 반환하는 함수입니다.

반환된 배열에는 4개의 키와 값이 포함되어 있습니다.

[유형] - 오류 유형
[메시지] - 오류 메시지
[파일] - 오류가 발생한 파일
[line] - 오류가 발생한 라인

사용 방법

<?php
register_shutdown_function( "fatal_handler" );
define(&#39;E_FATAL&#39;,  E_ERROR | E_USER_ERROR |  E_CORE_ERROR | 
        E_COMPILE_ERROR | E_RECOVERABLE_ERROR| E_PARSE );function fatal_handler() {  if( $error = error_get_last()) {    $errno   = $error["type"];    $errfile = $error["file"];    $errline = $error["line"];    $errstr  = $error["message"];    $str=<<<EOF         "errno":$errno
         "errstr":$errstr
         "errfile":$errfile
         "errline":$errlineEOF;
//获取到错误可以自己处理,比如记Log、报警等等    echo $str;
  }
}
로그인 후 복사

주의하세요

register_shutdown_function(파싱 시간 오류 발생 시 호출되지 않음) 기능. Register_shutdown_function()은 런타임 오류가 발생한 경우에만 호출됩니다.

아래 예를 들어보겠습니다.

NO.1

error_handler.php

<?phpregister_shutdown_function("error_handler");function error_handler(){    echo "Yeah,it&#39;s worked!";
}function test(){}function test(){}
로그인 후 복사

실행 결과는 다음과 같습니다.

치명적인 오류: 7행의/Users/shuchao/Desktop/error_handler.php에서 test()(이전에 /Users/shuchao/Desktop/error_handler.php:6에 선언됨)를 다시 선언할 수 없습니다

원인분석

error_handler.php 실행시 test() 두 함수가 반복적으로 정의되어 있기 때문에 php의 파싱타임(런타임이 아님)에 오류가 발생하여 Register_shutdown_function()에 있는 함수를 실행할 수 없습니다. 다시 전화했다.

NO.2

error_handler.php

<?phpregister_shutdown_function("error_handler");function error_handler(){    echo "Yeah,it&#39;s worked!";
}if(true){   function test(){}
}function test(){}
로그인 후 복사

실행 결과는 다음과 같습니다.

Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/error_handler.php:9) in /Users/shuchao/Desktop/error_handler.php on line 7Yeah,it&#39;s worked!%
로그인 후 복사

원인 분석

我们看到,上面回调了register_shutdown_function().
因为我们加了一个if()判断,if()里面的test()方法,相当于一个闭包,与外面的test()名称不冲突。
也就是,上面的代码在parse-time没有出错,而是在run-time的时候出错了,所以我们能够获取到fatal error。

NO.3

error_handler.php

<?phpregister_shutdown_function("error_handler");function error_handler(){    echo "Yeah,it&#39;s worked!";}
test_error.php
<?phpinclude &#39;./error_handler.php&#39;;function test(){}function test(){}
로그인 후 복사

执行 test_error.php的结果如下

Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/test_error.php:3) in/Users/shuchao/Desktop/test_error.php on line 4
로그인 후 복사

原因分析

当我们在运行test_error.php的时候,因为redeclare了两个test()方法,所以php的语法解析器在parse-time的时候就出错了。 所以不能回调register_shutdown_function()中的方法,不能catch住这个fatal error。

NO.4

error_handler.php
<?phpregister_shutdown_function("error_handler");function error_handler(){    echo "Yeah,it&#39;s worked!";}
test_error.php
<?phpfunction test(){}function test(){}
include_all.php
require &#39;./error_handler.php&#39;;require &#39;./test_error.php&#39;;
로그인 후 복사

执行 include_all.php的结果如下

Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/include_all.php:2) in /Users/shuchao/Desktop/include_all.php on line 3Yeah,it&#39;s worked!%
로그인 후 복사

结果分析

上面我们捕获了fatal_error.因为在运行include_all.php的时候,include_all.php本身语法并没有出错,也就是在parse-time的时候并没有出错,而是include的文件出错了,也就是在run-time的时候出错了,这个时候是能回调register_shutdown_function()中的函数的。

强烈建议:如果我们要使用register_shutdown_function进行错误捕捉,使用NO.4,最后一种方法,可以确保错误都能捕捉到。

更优美的写法·获取所有错误

set_error_handler()与register_shutdown_function()、error_get_last()的结合使用
<?phpregister_shutdown_function( "fatal_handler" );set_error_handler("error_handler");define(&#39;E_FATAL&#39;,  E_ERROR | E_USER_ERROR |  E_CORE_ERROR |         E_COMPILE_ERROR | E_RECOVERABLE_ERROR| E_PARSE );//获取fatal errorfunction fatal_handler() {    $error = error_get_last();    if($error && ($error["type"]===($error["type"] & E_FATAL))) {        $errno   = $error["type"];        $errfile = $error["file"];        $errline = $error["line"];        $errstr  = $error["message"];        error_handler($errno,$errstr,$errfile,$errline);  }}//获取所有的errorfunction error_handler($errno,$errstr,$errfile,$errline){    $str=<<<EOF         "errno":$errno         "errstr":$errstr         "errfile":$errfile         "errline":$errlineEOF;//获取到错误可以自己处理,比如记Log、报警等等    echo $str;}
Exception
Exception与Error的区别
Exception
로그인 후 복사

当异常抛出的时候,我们是想要去捕获他,并去做处理的。所以异常经常被当做程序的控制流程使用。

Error

Error是不可恢复的,是在开发过程中要去解决的。

使用Exception的例子

我想执行insert语句插入一条数据,可能插入失败(比如ID重复),注意是可能失败,所以这是一个可能的情况,也就是异常情况。我们就可以使用异常来处理这个问题

try {  $row->insert();  $inserted = true;
} catch (Exception $e) {  echo "There was an error inserting the row - ".$e->getMessage();  $inserted = false;
}echo "Some more stuff";
로그인 후 복사

如何catch一个未捕获的Exception

场景描述

假设程序中的有些地方直接throw了异常,没有进行catch。我们现在想要不管在程序的任何一个地方throw异常,即便在throw的地方没有被catch,我们也要能catch住,如何做到呢?

一个函数:set_exception_handler()

//设置默认的异常处理程序,用于没有用 try/catch 块来捕获的异常。 在 exception_handler 调用后异常会中止。

set_exception_handler()
로그인 후 복사

使用示例

1、exception_handler.php
<?phpset_exception_handler("my_exception");function my_exception($exception){    echo $exception->getMessage();}
2、test_exception.php
<?phprequire "./exception_handler.php";throw new Exception("I am Exception");
로그인 후 복사

现在我们运行 test_exception.php,结果如下:

I am Exception //证明我们throw的Exception被捕获了
로그인 후 복사


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