web-dev-qa-db-ja.com

例外を含むプラグインの処理エラー

新しいプラグインを作成していて、エラーをきれいに処理したいです。 WP_Errorクラスは扱いにくいので、例外を使用することにしました。私はPHP 4のサポートがないことに悩まされていません。

$error = true;
if ($error) {
    // Throw an error
    throw new CustomException('A custom exception');
}

私が本当にできるようにしたいのは私のプラグインで上記のコードのように例外を投げること(そして適切なところでtry/catchブロックを使うこと)です、しかし捕捉できない例外があるとき、エラーハンドラを設定できるようにしたいです。 :set_exception_handler()だけがキャッチする例外が私のプラグインからキャッチされました。したがって、別のテーマ例外ハンドラがすでに設定されていても、それは邪魔しません。

私のプラグイン例外のいずれかを傍受し、必要に応じてそれらを処理し、それからそれらを既に設定されている他の例外ハンドラに転送することを選択できればさらに良いでしょう。

これは可能ですか?それともそれが設定されているクラス内からのみ例外をキャッチする例外ハンドラを設定することは可能ですか?私はExceptionを拡張したcustomExceptionを作成し、それからどういうわけかそれのために独自のキャッチオール例外ハンドラーを持つことを考えていました。

1
The Salt

また、期待を広げて、投げたものだけをキャッチすることもできます。

例えば:

function do_add_my_pws_exceptions() {
   class PWS_Exception extends Exception {}
   class PWS_Init_Exception extends PWS_Exception {}
}
add_action('plugins_loaded', 'do_add_my_pws_exceptions');

もちろん、プラグインのアクティブ化をテーマにして、ユーザーがPHPの少なくともバージョン5を実行していることを確認してください。

$php_version = phpversion();
if ( version_compare( $php_version, '5.3', '<' ) ) {
    # deactivate your plugin or abort installing your theme and tell the user why
}

とにかく、それが終わったら、次のようなことができます。

try {
   # whatever you are doing
   throw new PWS_Exception("This is my exception", 10001);
} catch ( PWS_Exception $e ) {
   # Your custom handling
}

あなたによって投げられなかったどんな例外でもつかまえられないでしょう。

2
Privateer

set_exception_handlerを使用すると、前の例外ハンドラの名前が返されます。それを保存してcall_user_funcで使うことも、単に()構文を使うこともできます。

http://us.php.net/manual/en/function.set-exception-handler.php

$prev_handler = set_exception_handler('my_handler');
call_user_func($prev_handler, $exception);
# OR
$prev_handler($exception);
1
totels