处理包含异常的插件时出错

时间:2012-11-06 作者:The Salt

我正在创建一个新插件,我想干净地处理错误。我发现WP\\U错误类很难处理,所以决定使用异常。我并不担心缺少PHP 4支持。

$error = true;
if ($error) {
    // Throw an error
    throw new CustomException(\'A custom exception\');
}
我真正想做的是按照插件中的上述代码抛出异常(并在适当的情况下使用try/catch块),但当出现未捕获的异常时,我希望能够设置错误处理程序ie:set_exception_handler() 它只捕获插件中未捕获的异常。因此,如果已经设置了另一个主题异常处理程序,则不会产生干扰。

如果我截获任何插件异常,适当地处理它们,然后可以选择将它们转发到任何其他已设置的异常处理程序,那就更好了。

这可能吗?或者,是否可以设置一个只捕获所设置类中的异常的异常处理程序?我一直在考虑创建一个扩展异常的customException,然后以某种方式为其创建一个自定义的捕获所有异常处理程序。

2 个回复
SO网友:Privateer

您还可以扩展期望,然后只捕获您抛出的期望。

例如:

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
}
您未抛出的任何异常都不会被捕获。

SO网友:totels

当您使用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);

结束