エラー処理機構の変更


1. Exception と Error という 2 つの例外クラスが追加されました。

PHP7 には、Exception と Error という 2 つの例外クラスが追加されました。どちらのクラスも新しいインターフェイス 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 の従来のエラー報告メカニズムとは異なり、ほとんどのエラーはエラー例外としてスローされるようになりました。

この種の Error 例外は、通常の例外と同様に try / catch ブロックでキャッチできます。一致する try / catch ブロックがない場合、 例外処理関数 (set_Exception_handler() で登録) が呼び出されて処理されます。 例外ハンドラーが登録されていない場合は、従来の方法で処理され、致命的エラーとして報告されます。

Error クラスは Exception クラスから拡張されていないため、catch (Exception $e) { ... } のようなコードはキャッチできません。 エラーに。 catch (Error $e) { ... } のようなコードを使用するか、例外処理関数 ( set_Exception_handler()) を使用してエラーをキャッチします。

エラー例外階層


1 。エラー

  • 算術エラー


  • アサーションエラー


  • DivisionByZeroError


  • 解析エラー


  • タイプエラー


#2.例外

##...

###############################################例# #
#
<?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
1458887252-2773-exception-hiearchy.jpg
#PHP 7 例外
PHP 7 例外は、下位互換性と古いassert() 関数の拡張のために使用されます。これにより、運用環境でゼロコストのアサーションが可能になり、カスタム例外やエラーをスローする機能が提供されます。

API の古いバージョンは、互換性の目的で引き続き維持されます。assert() は、最初のパラメータを、評価される文字列やブール値だけでなく、式にすることができる言語構造になりました。テストされること。 assert() 設定


設定項目

デフォルト値オプション値

#zend.assertions

1

-1 - コードを生成しません (実稼働環境)#

パラメータ

アサーション

アサーション。 PHP 5 では、実行用の文字列またはテスト用のブール値。 PHP 7 では、これは任意の値を返す式にすることができ、その結果はアサーションが成功したかどうかを示すために使用されます。

description

アサーションが失敗した場合、オプションの説明が失敗メッセージに含まれます。

Exception

PHP 7 では、2 番目のパラメーターは文字列の代わりに Throwable オブジェクトにすることができます。このオブジェクトは、アサーションが失敗し、assert.Exception が有効な場合にスローされます。

zend.assertions を 0 に設定します:

<?php
ini_set('zend.assertions', 0);
assert(true == false);
echo 'Hi!';
?>

上記のプログラムの実行出力結果は次のとおりです:

Hi!

set zend.assertions を 1 に、assert.Exception を 1 に設定します。

Example

<?php
ini_set('zend.assertions', 1);
ini_set('assert.exception', 1);
assert(true == false);
echo 'Hi!';
?>

上記のプログラムの実行出力結果は次のとおりです。 :

Fatal error: Uncaught AssertionError: assert(true == false) in -:2Stack trace:#0 -(2): assert(false, 'assert(true == ...')#1 {main}
  thrown in - on line 2
1 - コードの生成と実行 (開発mode)

0 - コードを生成しますが、実行中はスキップします


#assert.Exception
0
  • 1 - 次の場合にスローされます。アサーションが失敗するか、例外オブジェクトがスローされるか、例外が提供されない場合は AssertionError オブジェクト インスタンスがスローされます。

  • #0 - Throwable を使用または生成します。オブジェクトをスローするのではなく、オブジェクトに基づいて警告を生成するだけです (PHP 5 と互換性があります)