2012-03-26 13 views
2

クラスは、作成する方法はあります、この1:PDO子オブジェクトの代わりにPDOExceptionの代わりにCustomExceptionをスローする方法はありますか?

class DB extends PDO {} 

(記録のためにただ一つの方法(コンストラクタ)我々はコンストラクタにはパラメータを渡していないと我々は接続するよう親1を過負荷を有していますコンフィギュレーション・ファイル経由)

どのような場合には、このようなカスタムCustomException投げることができ:$ePDOException occurreのインスタンスであることを

throw new CustomException($e->getMessage(), 500, array($e->...)); 

をd、デフォルトのPDOExceptionの代わりに、try-catchブロック内のすべてのメソッドをラップする必要はありませんか?

+0

この理由は何ですか? – Niko

+0

@ニコ、長くてかなり退屈な話。私は、アプリケーションが投げようとしているすべての例外をカバーするべきである集中化されたCustomExceptionを持たなければならない。ただ信じてください。私は使用する前にPDOExceptionをCustomExceptionに変換しなければなりません。 PDOのエラーモードを通常のPHPエラーとして設定することはできず、通常の警告としてそれらをキャッチすることはできません。 – Shoe

+0

ある時点ですべての例外をキャッチする必要がある場合は、そこに 'catch(Exception $ e)'だけを使用することを考えてください。それはPDOExceptionsとCustomExceptionsをキャッチします。 – Niko

答えて

3

あなたのコードが(タイプはダックタイピング対ヒント)である必要がありますタイプセーフかわからない:

あなたはないはPDOを拡張し、__call魔法のメソッドを介してデリゲートとしてそれを使用したクラスを書くことができます。 __call()の内部では、実際のP​​DO例外をキャッチしてカスタム例外にラップすることができます。だから、あなたはまだラッパーを書く必要がありますが、かなり短いものです。

+0

PDOStatementについてどうすればいいですか?これらのメソッドもカバーする必要があります。 – Shoe

+0

prepare()を上書きし、1つの__call()Wrapperでもう1つのデリゲートオブジェクトを返すことができます。あなたは単に上層のある点でPDOExceptionをキャッチし、CustomExceptionとしてラップ/再スローすると考えましたか? – tweber

+0

うん、私はしたし、オプションではありません。PDOStatementの拡張を設定することは可能ですが、PDOStatementの子でなければならないので、__call()は動作しません。私は他の何かを管理します。アイデアがあなたの心に来たら私に知らせてください:) – Shoe

1

独自のメソッドでカスタムExceptionをスローすることができます。あなたがの上に拡張したクラスで、各PDOの方法を書いた、と作られたのであれば、それらは次のようになります。

public function query($statement) { 
    try { 
     parent::query($statement); 
    } catch (PDOException $exception) { 
     throw new CustomException(whatever you want to do here); 
    } 
} 

PDOはPDO例外をスローしたときに、この方法で、それは例外をキャッチし、独自のカスタム例外をスローします。しかし、PDOはPDOStatementのような他のいくつかのクラスを使用しています。これは自分自身のPDOExceptionsを作成して上書きすることもできます。 PDOのメソッド引数を使ってステートメントクラスとして使用できます。

+0

私はまた、独自のメソッドで例外のスローをラップし、後で簡単に編集できるように呼びます。 – dqhendricks

+0

-1 "try-catchブロック内のすべてのメソッドをラップすることなく、徹底的に質問を読んでいない-1" * – FtDRbwLXw6

+0

@drrcknlsn彼は、クラスのインスタンスを使用するときに各メソッド呼び出しをラップする必要がないかもしれないことを意味するかもしれません各メソッドを上書きしてクラスのメソッド内にtry catchブロックを置くというオプションが知られています... – dqhendricks

関連する問題