昨日、PHPコードで例外の理由を解明しようとして半日費やしましたが、午前中に理由は自分自身であることがわかりました。 むしろ、PhpStorm IDEでデバッガを使用してコードの進行状況を追跡します。
状況の条件-カットの下。
開始するには、エラーメッセージは次のとおりです。
Warning: Magento\Ui\TemplateEngine\Xhtml\Result::__toString(): Not yet implemented in /.../Xhtml/Result.php on line 97
次に、メッセージに記載されているコード番号97の行:
if ('noNamespaceSchemaLocation' === $name)
すべてが透明であるかのように-比較するときに$name
文字列に変換されると、例外が発生します(この場合のスタックトレースでは、 $name
__toString()
メソッドである$name
考えが少し後に思い浮かびます)。
メソッド自体は次のとおりです。
public function __toString() { try { $templateRootElement = $this->getDocumentElement(); foreach ($templateRootElement->attributes as $name => $attribute) { if ('noNamespaceSchemaLocation' === $name) { $this->getDocumentElement()->removeAttributeNode($attribute); break; } } $templateRootElement->removeAttributeNS('http://www.w3.org/2001/XMLSchema-instance', 'xsi'); $this->compiler->compile($templateRootElement, $this->component, $this->component); $this->appendLayoutConfiguration(); $result = $this->compiler->postprocessing($this->template->__toString()); } catch (\Exception $e) { $this->logger->critical($e->getMessage()); $result = $e->getMessage(); } return $result; }
すでに幾分カーリーがあります-例外をキャッチするtry ... catchブロックがあります。 しかし、犯罪もありません:動作するすべて-コンパイラによって文字列になります( $result = $this->compiler->postprocessing(...)
)、動作しません-エラーメッセージになります( $result = $e->getMessage()
)。
私は、このコードのデバッガーの下でif ('noNamespaceSchemaLocation' === $name)
に$this->logger->critical($e->getMessage())
、例外をキャッチし、 $this->logger->critical($e->getMessage())
、その後、 \Magento\Backend\Model\Session\Interceptor::writeClose
への不可解なジャンプ\Magento\Backend\Model\Session\Interceptor::writeClose
、その後アプリケーションが中断されます。
それだけです すべてが水で終わる-実行スレッドが終了し、ブラウザの「HTTP ERROR 500」で、サーバーログにResult::__toString(): Not yet implemented
。
そして、デバッガーで__toString()
メソッドを入力するだけで、アプリケーションはそのような奇妙な方法で終了します。 ステップオーバーをスキップすると、コードのこのセクションは正しく機能します。 また、デバッガなしで実行しているときにクラッシュしません。
PhpStorm 2017.1.3の環境でデバッグを実行しました。 IDEには、アプリケーションの操作に関する多くの有用な情報(スタックトレース、ウォーキング変数、ウォッチャー)が表示されます。
そして、もちろん、動作中のアプリケーションと対話します。
この場合、集会が行われる理由はわかりませんでした。 私はまだIDEやインタープリターの開発者ではなく、Web開発者です。
「 私たちの概念が弱いからではなく、多くのものが理解できない。しかし、これらのものは私たちの概念の輪に含まれていないからだ。 」コズマ・プルトコフ
エラーの原因を見つけるための試みでは、コード実行の過程に対するIDEの影響を完全に無視しました。その結果、半日、ぐるぐる回っていました。
PS
これは、上記のケースが現在明らかであり、ハブではなく別の「インターネット」での経験を共有しているすべての人のためのものです。
PPS
記事を書いている間、デバッガーの下のアプリケーションは、期待どおりに動作し始めました。 これがどの時点で発生したのかは明確ではありません(昨日は稼働中のマシンがあり、今日はラップトップであり、その上で状況を再現しました)。 しかし、これは記事自体の本質を変えるものではありません-「 デバッグするとき、特にアプリケーションの動作が不可解になる場合は、IDEがアプリケーションに与える影響を考慮してください 。」