Joomlaの現在のバージョン(3.9.6)全体で、SQL例外の処理方法が混在していることを知り、一方を他方に対して使用する必要がある決定的な状況を誰かが私に与えることができるかどうか疑問に思いましたか?
Joomlaの最新バージョン用に開発している場合、クエリに常にJDatabaseExceptionExecutingを使用する必要がありますか?
参照:
この問題についてもう少し情報が欲しい他の人のために。
Githubリンク:https://github.com/joomla/joomla-cms/pull/10337
データベースAPIは、すべてのエラー条件に対してRuntimeExceptionをスローします。例外がスローされるのは良いことですが、このクラスはExceptionクラスチェーンの上位にあるため(これはExceptionの直接の子孫であり、両方のPHPコアライブラリとサードパーティライブラリ)によって大幅にサブクラス化されています)、それはむしろ汎用クラスであり、文字列を解析せずにエラーがスローされた理由に関する多くのコンテキストを提供しません。
このPRは、データベースAPIのいくつかのコンテキスト例外クラスを作成し、より一般的なRuntimeExceptionの代わりにこれらのサブクラスをスローするように変更します。これらの新しいExceptionクラスはすべてRuntimeExceptionを拡張するため、既存のtry/catchの使用によるB/Cブレークはありません。
JDatabaseExceptionUnsupported
JDatabaseExceptionExecuting
JDatabaseExceptionConnecting
RuntimeExceptionとJDatabaseExceptionExecutingの違いはセマンティクスの問題であり、継承。
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
(または状況に合わせて特殊化された別の適切なクラス)を使用する必要があります。