오류와 예외의 유사점과 차이점
"오류"와 "예외"의 개념은 매우 유사하며 쉽게 혼동될 수 있습니다. "오류"와 "예외"는 모두 프로젝트에 문제가 있음을 나타내며 둘 다 제공합니다. 관련 정보가 있으며 둘 다 오류 유형이 있습니다. 그러나 "오류 메커니즘" 다음에 "예외 메커니즘"이 등장했으며, "예외"는 "오류"를 피할 수 없다는 단점이 있습니다. 더 중요한 점은 "오류" 정보가 풍부하지 않다는 것입니다. 우리가 본 가장 일반적인 함수 설명은 성공하면 ***를 반환하고, 오류가 발생하면 FALSE를 반환하는 것입니다. , 및 오류 유형이 더 있습니다. 간단한 FALSE는 호출자에게 특정 오류 메시지를 알릴 수 없습니다.
PHP에서는 코드 자체 예외(일반적으로 환경 또는 잘못된 구문으로 인해 발생)가 오류가 되며, 예외 오류는 코드로 처리할 수 없으며 예외는 try/catch로 처리할 수 있습니다.
Exceptions
예외는 돌이킬 수 없는 상황이 발생할 때 발생하는 Exception 클래스의 객체입니다. 예외는 책임을 사전에 위임하고 잠재적인 문제를 예측하고 그 영향을 완화하기 위해 방어적으로 사용될 수도 있습니다.
Exception 개체에는 두 가지 주요 속성이 있습니다. 하나는 메시지이고 다른 하나는 숫자 코드입니다. getCode() 및 getMessage()를 각각 사용하여 이 두 가지 속성을 얻을 수 있습니다. 다음과 같습니다:
<?php $exception = new Exception("figthing!!!",100); $code = $exception->getCode();//100 $message = $exception->getMessage();//fight.....
예외 발생
예외가 발생하면 코드 실행이 즉시 중지되고 후속 코드는 더 이상 실행되지 않습니다. PHP는 일치하는 "catch" 코드 블록을 찾으려고 시도합니다. 예외가 포착되지 않고 set_Exception_handler()를 사용하여 적절하게 처리되지 않으면 PHP는 심각한 오류를 생성하고 Uncaught Exception... 메시지를 출력합니다.
throw new Exception("this is a exception");//使用throw抛出异常
Catch 예외
우리는 던져진 예외를 잡아서 우아한 방식으로 처리해야 합니다. 예외를 가로채서 처리하는 방법은 예외를 발생시킬 수 있는 코드를 try/catch 블록에 넣는 것입니다. 그리고 여러 예외를 가로채기 위해 여러 개의 catch를 사용하는 경우 그 중 하나만 실행됩니다. PHP가 적절한 catch 블록을 찾지 못하면 치명적인 오류로 인해 PHP 스크립트가 종료될 때까지 예외가 발생합니다. 다음과 같습니다:
try { throw new Exception("Error Processing Request"); $pdo = new PDO("mysql://host=wrong_host;dbname=wrong_name"); } catch (PDOException $e) { echo "pdo error!"; } catch(Exception $e){ echo "exception!"; }finally{ echo "end!";//finally是在捕获到任何类型的异常后都会运行的一段代码 }
运行结果:exception!end!
Exception handler
그러면 발생할 수 있는 모든 예외를 어떻게 잡아야 할까요? PHP를 사용하면 포착되지 않은 모든 예외를 포착하는 전역 예외 처리기를 등록할 수 있습니다. 예외 처리기는 set_Exception_handler() 함수를 사용하여 등록됩니다(여기서는 익명 함수가 사용됩니다).
set_exception_handler(function (Exception $e) { echo "我自己定义的异常处理".$e->getMessage(); }); throw new Exception("this is a exception"); //运行结果:我自己定义的异常处理this is a exception
Errors
예외 외에도 PHP는 오류 보고 기능도 제공합니다. PHP는 치명적인 오류, 런타임 오류, 컴파일 타임 오류, 시작 오류, 사용자에 의해 발생한 오류 등 다양한 유형의 오류를 유발할 수 있습니다. 오류 보고 방법은 php.ini에서 설정할 수 있습니다(여기서는 추가 설명 없음)
몇 가지 오류 보고 수준은 다음과 같습니다.
值 常量 说明1 E_ERROR 报告导致脚本终止运行的致命错误2 E_WARNING 报告运行时的警告类错误(脚本不会终止运行)4 E_PARSE 报告编译时的语法解析错误8 E_NOTICE 报告通知类错误,脚本可能会产生错误32767 E_ALL 报告所有的可能出现的错误(不同的PHP版本,常量E_ALL的值也可能不同)
어쨌든 다음 규칙을 따라야 합니다.
PHP에서 보고하도록 해야 합니다. 오류
오류는 개발 환경에서 표시되어야 합니다
오류는 프로덕션 환경에서 표시될 수 없습니다
오류는 개발 환경과 프로덕션 환경 모두에서 기록되어야 합니다
오류 처리기
및 예외 처리기 마찬가지로 set_error_handler()를 사용하여 전역 오류 처리기를 등록하고 자체 논리를 사용하여 PHP 오류를 가로채고 처리할 수도 있습니다. 오류 처리기에서 die() 또는 exit() 함수를 호출해야 합니다. 호출되지 않으면 PHP 스크립트는 오류가 발생한 지점부터 계속 실행됩니다. 다음과 같습니다:
set_error_handler(function ($errno,$errstr,$errfile,$errline)//常用的四个参数 { echo "错误等级:".$errno."<br>错误信息:".$errstr."<br>错误的文件名:".$errfile."<br>错误的行号:".$errline; exit(); }); trigger_error("this is a error");//自行触发的错误 echo '正常';
실행 결과:
오류 수준: 1024
오류 메시지: 오류입니다
오류 파일 이름: /Users/toby/Desktop/www/Exception.php
오류 줄 번호: 33
관련 있음 또한 함수register_shutdown_function()---PHP가 종료될 때 실행될 함수입니다. (관심 있으신 분들은 직접 확인해보세요)
오류를 예외로 변환
PHP 오류를 예외로 변환할 수 있습니다. (모든 오류를 변환할 수 있는 것은 아니며 php.ini 파일의 error_reporting 지시어에 의해 설정된 오류만 변환), 예외 처리를 위해 기존 프로세스를 사용하여 오류를 처리합니다. 여기서는 set_error_handler() 함수를 사용하여 오류 정보를 ErrorException(Exception의 하위 클래스)에 호스팅한 다음 처리를 위해 기존 예외 처리 시스템에 넘겨줍니다. 다음과 같습니다:
set_exception_handler(function (Exception $e) { echo "我自己定义的异常处理".$e->getMessage(); }); set_error_handler(function ($errno, $errstr, $errfile, $errline ) { throw new ErrorException($errstr, 0, $errno, $errfile, $errline);//转换为异常 }); trigger_error("this is a error");//自行触发错误
작업 결과: 내가 정의한 예외 처리는 오류입니다
PHP7 오류 예외 처리
PHP 7 改变了大多数错误的报告方式。不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出。
这种 Error 异常可以像 Exception 异常一样被第一个匹配的 try / catch 块所捕获。如果没有匹配的 catch 块,则调用异常处理函数(事先通过 set_exception_handler() 注册)进行处理。 如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(Fatal Error)。
Error 类并非继承自 Exception 类,所以不能用 catch (Exception $e) { ... } 来捕获 Error。你可以用 catch (Error $e) { ... },或者通过注册异常处理函数( set_exception_handler())来捕获 Error。
$a=1; try { $a->abc();//未定义此对象 } catch (Exception $e) { echo "error"; } catch (Error $e) { echo $e->getCode(); }
运行结果:0
PHP7 中出现了 Throwable 接口,该接口由 Error 和 Exception 实现,用户不能直接实现 Throwable 接口,而只能通过继承 Exception 来实现接口
try { // Code that may throw an Exception or Error. } catch (Throwable $t) { // Executed only in PHP 7, will not match in PHP 5.x } catch (Exception $e) { // Executed only in PHP 5.x, will not be reached in PHP 7 }
注意实际项目中,在开发环境中我们可以使用Whoops组件,在生产环境中我们可以使用Monolog组件。
相关推荐:
위 내용은 PHP7 오류 및 예외 처리 예제 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!