web-dev-qa-db-ja.com

PHP 7 VSCODEのXdebug:例外を無視する方法

私はプラグインを使用していますPHP Visual Studio CodeのデバッガーPHPコードです。PHP <= 5.6。デバッガは魅力的に機能しましたが、PHP= 7でコードをデバッグしようとすると、期待どおりに機能しません。追加したブレークポイントにジャンプしませんでした。ようにthounsand例外で立ち往生

例外が発生しました。非推奨:クラスと同じ名前のメソッドは、PHPの将来のバージョンではコンストラクターではなくなります。 RecurringTypeには非推奨のコンストラクタがあります

または

例外が発生しました。警告:AntlrLexer :: matchAny()の宣言はBaseRecognizer :: matchAny($ input)と互換性があるはずです

または

例外が発生しました。通知:非オブジェクトのプロパティを取得しようとしています

これらの例外はフレームワークによって生成されるため、すべてを修正することはできません。これらの例外をすべてスキップして、ブレークポイントのみにジャンプしたいだけです。

どうすればそれを達成できますか?ありがとう。

14
Hieu Nguyen

これがあなたの設定で機能するかどうかはわかりません(私はPHP 7.2を使用しています)。これがXDebugがすべての例外、警告、通知などをトリガーしないように機能することがわかりました。自分のコードのセクションをステップスルーしたいだけの場合。

最初に、Everythingデバッグセクションのすべて(チェックされている場合はBreakpointsを含む)をオフにします。

XDebug Breakpoints

次に、Breakpointsバーにカーソルを合わせ、+をクリックします。

Breakpoint bar - Add Function

次に、デバッグする関数の名前を追加します。

Add breakpoint function

最後に、その関数内にブレークポイントを設定します。これで、その関数内でのみXDebugステップスルーをトリガーできるようになります。

Stepping through an XDebug session without triggering every exception

おそらく、独自の関数ブレークポイントを必要なだけ追加できます。興味深いことに、同じ名前の関数が複数ある場合は、関数名を1回追加するだけで済みます。

9
MQuiggGeorgia

問題

使用しているフレームワークは、PHP 7のバージョンを念頭に置いて記述されているようです。エラー処理には changed があり、未処理の例外またはThrowableインスタンスが set_exception_handler() 関数で定義された例外処理関数までバブルアップします。より大きな問題は、FATAL ERRORbang bangを意味し、プロセスはデッドであり、デバッガーがバインドするものはありません。

PHP 7では、ほとんどのエラーがPHPによって報告される方法が変更されています。 PHP 5で使用される従来のエラー報告メカニズムを通じてエラーを報告する代わりに、ほとんどのエラーは Error exceptions をスローすることで報告されるようになりました。

通常の例外と同様に、これらのエラー例外は、最初に一致するcatchブロックに到達するまで発生します。一致するブロックがない場合、set_exception_handler()でインストールされたデフォルトの例外ハンドラーが呼び出され、デフォルトの例外ハンドラーがない場合、例外は致命的なエラーに変換され、従来のエラーと同様に処理されます。

Error階層はExceptionから継承しないため、catch(Exception $ e){...}ブロックを使用してPHP 5でキャッチされない例外を処理するコードは、これらのエラーがこれらのブロックです。catch(エラー$ e){...}ブロックまたはset_exception_handler()ハンドラーが必要です>。


解決

では、これらのエラー(致命的なエラーに変換されて実行を停止する)をすべてスキップして、ブレークポイントに到達できるようにするにはどうすればよいでしょうか。 set_exception_handler()でエラーハンドラを定義する。

フレームワークのブートストラップコードにこのようなものを挿入します。フレームワークがこれをオーバーライドする可能性のある場所を必ず探してください。

_function ignore_exceptions_handler($exception) {
   // Do nothing here
}

set_exception_handler('ignore_exceptions_handler');
_

リファレンス: http://php.net/manual/en/function.set-exception-handler.php


もっと詳しく

なぜこれが起こるのですか? Visual Studioやデバッガーとは関係ありません。 PHP 7は、以前のバージョン(例:<= 5.6)よりも明示的にエラーを強制するだけです。使用しているフレームワークには、PHP 7およびエラーは処理されていません。

ここに他に興味深いものがあります: https://docs.devsense.com/en/debugging/exceptions

2
Jeremy Harris

私の場合、拡張機能またはエディタには、デフォルトでEVERYTHINGオプションがオンになっています。 EVERYTHINGチェックボックスをオフにすると、問題が修正されました。

0
Rafalfaro