web-dev-qa-db-ja.com

(RuntimeException $ e)と(JDatabaseExceptionExecuting $ e)の比較によるSQL例外処理

Joomlaの現在のバージョン(3.9.6)全体で、SQL例外の処理方法が混在していることを知り、一方を他方に対して使用する必要がある決定的な状況を誰かが私に与えることができるかどうか疑問に思いましたか?

Joomlaの最新バージョン用に開発している場合、クエリに常にJDatabaseExceptionExecutingを使用する必要がありますか?

参照:

  • (RuntimeException $ e)administrator/components/com_redirect/models/link.php行40
  • (JDatabaseExceptionExecuting $ e)plugins/system/actionlogs/actionlogs.php行192

追加情報

この問題についてもう少し情報が欲しい他の人のために。

Githubリンク:https://github.com/joomla/joomla-cms/pull/10337

新しいデータベースの例外を追加して使用する#10337

データベースAPIは、すべてのエラー条件に対してRuntimeExceptionをスローします。例外がスローされるのは良いことですが、このクラスはExceptionクラスチェーンの上位にあるため(これはExceptionの直接の子孫であり、両方のPHPコアライブラリとサードパーティライブラリ)によって大幅にサブクラス化されています)、それはむしろ汎用クラスであり、文字列を解析せずにエラーがスローされた理由に関する多くのコンテキストを提供しません。

このPRは、データベースAPIのいくつかのコンテキスト例外クラスを作成し、より一般的なRuntimeExceptionの代わりにこれらのサブクラスをスローするように変更します。これらの新しいExceptionクラスはすべてRuntimeExceptionを拡張するため、既存のtry/catchの使用によるB/Cブレークはありません。

RuntimeExceptionを拡張する3つのJDatabse例外クラスがあります。

JDatabaseExceptionUnsupported

  • サポートされていないデータベースオブジェクトを定義する例外クラス
  • libraries/joomla/database/exception/unsupported.php

JDatabaseExceptionExecuting

  • ステートメントの実行エラーを定義する例外クラス
  • libraries/joomla/database/exception/executing.php

JDatabaseExceptionConnecting

  • データベースプラットフォームへの接続エラーを定義する例外クラス
  • libraries/joomla/database/exception/connecting.php
4
CoalaWeb

RuntimeExceptionJDatabaseExceptionExecutingの違いはセマンティクスの問題であり、継承。

PHPでは、RuntimeExceptionはExceptionクラスを拡張します(基本クラス-php7以前はThrowableインターフェースを提供していませんでした)。

https://www.php.net/manual/en/class.exception.php

https://php.net/manual/en/class.runtimeexception.php

https://api.joomla.org/cms-3/classes/JDatabaseExceptionExecuting.html

クラスの拡張は、元のクラスが提供しない方法で特殊なハンドル/詳細を提供するために行われます。

JDatabaseExceptionExecutingは、予想される種類の例外をキャッチするための、より明確で専用の方法です。コードの特定の部分でどのような種類の例外が発生する可能性があるかがわかっている場合、その例外をどのように処理するかを慎重に検討し、最も適切なクラス内のメソッドを使用できます。以下がその機能です。

ステートメントの実行エラーを定義する例外クラス

getQuery()は、JDatabaseExceptionExecuting基本クラスを拡張するRuntimeExceptionクラスを拡張するExceptionクラス内の(コンストラクターを超えた)唯一のメソッドです。

このStackoverflowページは参考になるはずです: https://stackoverflow.com/q/41608131/29434

結局のところ、私の助言は、クエリステートメントの実行中に生成された例外をキャッチしようとするときにJDatabaseExceptionExecutingを使用することです。それ以外の場合は、RuntimeException(または状況に合わせて特殊化された別の適切なクラス)を使用する必要があります。

4
mickmackusa