오류 처리 메커니즘 수정


1. 이제 Exception과 Error라는 두 가지 예외 클래스가 있습니다.

PHP7에는 이제 Exception과 Error라는 두 가지 예외 클래스가 있습니다. 두 클래스 모두 새로운 인터페이스인 Throwable을 구현합니다. 예외 처리 코드에서 유형 힌트를 조정해야 할 수도 있습니다.

2. 일부 치명적인 오류와 복구 가능한 치명적인 오류는 대신 Error 개체를 발생시킵니다.

일부 치명적인 오류 및 복구 가능한 치명적인 오류는 이제 대신 오류 개체를 보고합니다. Error 객체는 Exception과 독립적이며 일반적인 try/catch로 포착할 수 없습니다. 편집자 주: 오류 처리 기능을 등록해야 합니다. 아래 RFC를 참조하세요.

예외로 전환된 이러한 복구 가능한 치명적인 오류는 오류 처리기를 통해 자동으로 무시될 수 없습니다. 특히 유형 힌트 오류는 무시할 수 없습니다.

3. 구문 오류는 ParseError 개체를 발생시킵니다.

구문 오류는 Error 개체에서 상속되는 ParseError 개체를 발생시킵니다. 이전에 eval()을 처리할 때 잠재적으로 오류가 발생하기 쉬운 코드에 대한 반환 값 또는 error_get_last()를 확인하는 것 외에도 ParseError 객체도 캡처해야 합니다.

4. 내부 객체의 생성 방법은 실패할 경우 항상 예외를 발생시킵니다.

내부 객체의 생성 방법은 실패할 경우 항상 예외를 발생시킵니다. 일부 이전 생성자는 NULL 또는 사용할 수 없는 개체를 반환했습니다.

5. 일부 E_STRICT 오류 수준이 조정되었습니다.


PHP 7 오류 처리

#🎜 🎜#

PHP 7에서는 대부분의 오류가 보고되는 방식이 변경되었습니다. PHP 5의 기존 오류 보고 메커니즘과 달리 이제 대부분의 오류는 오류 예외로 발생합니다.

이 오류 예외는 일반 예외처럼 try/catch 블록으로 포착될 수 있습니다. 일치하는 try/catch 블록이 없는 경우, 처리를 위해 예외 처리 함수(set_Exception_handler()에 의해 등록됨)가 호출됩니다. 예외 처리기가 등록되지 않은 경우 기존 방식으로 처리됩니다. 즉, 치명적인 오류로 보고됩니다.

Error 클래스는 Exception 클래스에서 확장되지 않으므로 catch (Exception $e) { ... }와 같은 코드는 catch할 수 없습니다. 오류에. catch (Error $e) { ... }와 같은 코드를 사용하거나 예외 처리기( set_Exception_handler())를 사용하여 오류를 포착합니다.

오류 예외 계층 구조
#🎜 🎜 #1.오류 ​​

    산술 오류       

  • AssertionError ​

  • DivisionByZeroError       

  • ParseError ​

  • TypeError

  • 2.예외

...

1458887252-2773-exception-hiearchy.jpg
# 🎜 🎜#

Example

<?php
class MathOperations 
{
   protected $n = 10;
   // 求余数运算,除数为 0,抛出异常
   public function doOperation(): string
   {
      try {
         $value = $this->n % 0;
         return $value;
      } catch (DivisionByZeroError $e) {
         return $e->getMessage();
      }
   }
}
$mathOperationsObj = new MathOperations();
print($mathOperationsObj->doOperation());
?>

위 프로그램 실행의 출력 결과는 다음과 같습니다.

Modulo by zero
# 🎜🎜##🎜 🎜#


PHP 7 예외PHP 7 예외는 이전 버전과의 호환성을 위해 사용됩니다. 그리고 기존 Asserts () 기능을 강화했습니다. 프로덕션 환경에서 비용이 전혀 들지 않는 어설션을 활성화하고 사용자 지정 예외 및 오류를 발생시키는 기능을 제공합니다.

호환성을 위해 이전 버전의 API는 계속 유지됩니다. 이제 Assert()는 평가할 문자열이 아닌 첫 번째 인수가 표현식이 되도록 허용하는 언어 구성입니다. 테스트할 부울입니다.

assert() 구성

구성 항목0 - 코드 생성, 그러나 실행 중에 건너뛰기-1 - 코드 생성 없음(프로덕션 환경)
기본값#🎜 🎜 ## ####옵션 값#### ## ## ## ## ###Zend.Assertions#🎜🎜 #####1#### 🎜 🎜#

1 - 코드 생성 및 실행(개발 모드)


# Assert.Exceptionion 실패 시 발생하며, 예외 객체가 발생하거나, 예외가 제공되지 않으면 AssertionError 객체 인스턴스가 발생합니다.
  • 0 - Throwable을 사용하거나 생성합니다. 객체를 던지는 대신 객체를 기반으로 경고를 생성합니다(PHP 5와 호환 가능)
  • # 🎜🎜 #

  • parameters

    assertion

    어설션. PHP 5에서는 실행을 위한 문자열 또는 테스트를 위한 부울입니다. PHP 7에서는 임의의 값을 반환하는 표현식이 될 수 있으며 결과는 어설션이 성공했는지 여부를 나타내는 데 사용됩니다.

    description

    어설션이 실패하면 실패 메시지에 옵션 설명이 포함됩니다.

    Exception

    PHP 7에서 두 번째 매개변수는 문자열 대신 Throwable 객체일 수 있으며, 이는 어설션이 실패하고 Assert.Exception이 활성화된 경우 발생합니다. 인스턴스

    <?php
    ini_set('zend.assertions', 0);
    assert(true == false);
    echo 'Hi!';
    ?>
    위 프로그램 실행의 출력 결과는 다음과 같습니다.
    Hi!