이 기사에서는 특정 참조 값이 있는 PHP7의 오류 예외 수준을 소개합니다. 이제 모든 사람과 공유합니다. 도움이 필요한 친구들이 참조할 수 있습니다.
PHP 7의 예외 살펴보기 Hierarchy
예전 PHP에서는 치명적인 오류를 처리하는 것이 거의 불가능했습니다. 치명적인 오류는 set_error_hander() 오류 핸들러를 호출하지 않고 단순히 스크립트 실행을 종료합니다.
PHP 7에서는 치명적이거나 복구 가능한 오류(E_ERROR 및 E_RECOVERABLE_ERROR)가 발생하면 스크립트를 중단하는 대신 예외가 포착됩니다. 특정 상황에서는 여전히 메모리 부족 등 치명적인 오류가 발생하며 이전과 마찬가지로 스크립트가 즉시 종료됩니다. 포착되지 않은 예외는 PHP 7에서 여전히 치명적인 오류입니다. 이는 PHP 5.x에서 포착되지 않은 예외가 PHP 7에서는 여전히 치명적인 오류임을 의미합니다.
경고나 알림과 같은 오류는 PHP 7에서 변경되지 않고 그대로 유지되며, 치명적인 오류나 복구 가능한 오류만 예외를 발생시킵니다.
치명적이거나 복구 가능한 오류 발생은 Exception 클래스에서 확장되지 않습니다. 이러한 분리는 기존 PHP 5.x 코드가 오류 예외를 수신하는 경우 종료 루틴을 호출하지 못하도록 하기 위한 것입니다. 치명적이거나 복구 가능한 오류로 인해 발생한 예외는 새로운 예외 클래스인 Error를 인스턴스화합니다. 다른 예외 클래스와 마찬가지로 발견된 Error 클래스는 마지막 프로그램 블록이 실행된 후에 처리됩니다.
PHP 7 alpha-2와 비교하면 PHP 7의 예외 클래스 계층 구조는 다릅니다. 발생한 치명적이고 복구 가능한 오류는 EngineException 클래스에 의해 인스턴스화되며 EnginException 클래스는 Exception에서 상속되지 않습니다. Exception과 EngineException은 모두 BaseException에서 상속됩니다.
이 두 가지 예외 분기를 결합하기 위해 Exception과 Error는 모두 Throwable이라는 새로운 인터페이스를 구현합니다.
PHP 7의 새로운 예외 계층 구조는 다음과 같습니다.
Throwable //(接口) |- Exception implements Throwable |- ... |- Error implements Throwable |- TypeError extends Error |- ParseError extends Error // 编译时错误 |- ArithmeticError extends Error |- pisionByZeroError extends ArithmeticError |- AssertionError extends Error
PHP 7에서 Throwable 인터페이스를 정의하는 경우 다음 코드와 유사해야 합니다.
interface Throwable{ public function getMessage(): string; public function getCode(): int; public function getFile(): string; public function getLine(): int; public function getTrace(): array; public function getTraceAsString(): string; public function getPrevious(): Throwable; public function __toString(): string;}
이 인터페이스는 익숙할 것입니다. Throwable 관련 메소드는 Exception과 동일합니다. 유일한 차이점은 Throwable::getPrevious()가 Throwable 예외를 반환하고 Error 클래스의 생성자가 이전 예외로 Throwable 인스턴스를 수신한다는 것입니다.
Throwable은 try/catch 블록에서 예외나 오류 개체를 잡는 데 사용할 수 있습니다(향후 더 많은 예외 유형이 포착될 수 있습니다). 여기서는 보다 구체적인 예외 클래스를 캡처하고 적절한 처리 조치를 취하는 것이 좋습니다. 그러나 어떤 경우에는 예외를 광범위하게 포착해야 합니다(예: 로깅 또는 프레임워크의 오류 처리). PHP 7에서는 이러한 예외 포착 블록이 Exception 대신 Throwable을 사용하는 데 더 적합합니다.
try { // Code that may throw an Exception or Error.} catch (Throwable $t) { // Handle exception}
사용자 정의 클래스는 부분적으로 예측 가능성과 일관성으로 인해 Throwable 플러그인을 구현할 수 없습니다. Excetion 및 Error 클래스를 인스턴스화하는 경우에만 예외가 발생할 수 있습니다. 또한 예외는 스택에 생성된 개체에 대한 정보를 전달합니다. 사용자 정의 클래스에는 정보를 보유하는 매개변수가 자동으로 포함되지 않습니다.
Throwable을 확장하여 패키지별 인터페이스를 만들거나 추가 메서드를 추가할 수 있습니다. Exception 또는 Error를 상속하는 클래스만 Throwable을 확장하는 플러그인을 구현할 수 있습니다.
interface MyPackageThrowable extends Throwable {}class MyPackageException extends Exception implements MyPackageThrowable {}throw new MyPackageException();
PHP 5 이하 버전에서는 모든 오류가 치명적 오류 또는 복구 가능한 치명적 오류인 반면, PHP 7에서는 모든 오류가 발생합니다. 다른 예외와 마찬가지로 Error 객체는 try/catch 블록을 통해 포착될 수 있습니다.
$var = 1;try { $var->method(); // Throws an Error object in PHP 7.} catch (Error $e) { // Handle error}
일반적으로 이전의 치명적인 오류는 Error 기본 클래스의 인스턴스화를 발생시키지만 일부 오류는 TypeError, ParseError 및 AssertionError와 같은 보다 구체적인 Error 하위 클래스를 발생시킵니다.
TypeError 인스턴스화는 함수 호출 시 선언된 형식 매개변수와 실제 매개변수 유형이 일치하지 않는 경우(수신 매개변수가 메서드에 정의된 매개변수 유형과 일치하지 않음) ), TypeError 인스턴스가 발생합니다.
function add(int $left, int $right){ return $left + $right; }try { $value = add('left', 'right'); } catch (TypeError $e) { echo $e->getMessage(), "\n"; }
출력 획득:
Argument 1 passed to add() must be of the type integer, string given
포함/필수 파일 또는 eval()의 코드에 구문 오류가 있는 경우 ParseError가 발생합니다.
try { require 'file-with-parse-error.php'; } catch (ParseError $e) { echo $e->getMessage(), "\n"; }
Throw ArithmeticError 두 가지 상황이 있습니다: 음수 치환, 또는 PHP_INT_MIN을 분자로 사용하고 -1을 분모로 사용하여 intp()를 호출합니다 (PHP_INI_MIN / -1 반환 값은 부동 소수점 유형입니다) .
try { $value = 1 << -1; } catch (ArithmeticError $e) { echo $e->getMessage(), "\n"; }
분모가 0일 때 intp() 또는 나머지(%)를 사용하면 pisionByZeroError 오류가 발생합니다. 0으로 나누면 경고만 발생하고 NaN으로 평가됩니다.
try { $value = 1 % 0; } catch (pisionByZeroError $e) { echo $e->getMessage(), "\n"; }
assertion()으로 설정된 조건이 충족되지 않으면 AssertionError가 발생합니다.
ini_set('zend.assertions', 1); ini_set('assert.exception', 1);$test = 1; assert($test === 0);
는 Assertion()이 설정한 조건을 충족하지 않고 AssertionError 오류를 발생시키며, AssertionError = 1인 경우 예외 출력은 다음과 같습니다.
Fatal error: Uncaught AssertionError: assert($test === 0)
assert()는 실행만 되고 어설션이 있는 경우에만 AssertionError를 발생시킵니다. ini 설정 zend.assertions = 1 및 Assert.Exception = 1을 사용하여 활성화되고 예외를 발생시키도록 설정됩니다.
用户可以创建自己的 Error 类,作为 Error 基类的拓展。这可能带来重要的问题:什么场合下应该抛出一个 Exception 类的子类实例,什么场合下又应该抛出 Error 类的子类实例?
由于错误对象不应当在程序运行中处理,捕获错误对象应当是少见的。通常而言,错误对象应当捕获并记录之,执行必要的清理,并给用户展示错误信息。
在 PHP 5.x 和 7 使用相同的代码捕获异常,可以实用多重捕获代码块,首先捕获 Throwable,之后时 Exception。一旦不需要维护 PHP 5.x 的系统,代码块可以立刻被清理掉。
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}
英文原文: trowski.com/2015
本文虽拙,却也系作者劳动,转载还请保留本文链接: http://cyleft.com/?p=721
相关推荐:
위 내용은 PHP 7 오류 예외 수준의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!