Catch own Exceptions

时间:2014-03-06 作者:Michał Kalkowski

我用自己的异常构建了一些包,但当我尝试捕获异常时,出现了致命错误:Uncaught exception. 这种情况仅在通过带有throw的方法时出现add_action( \'init\', array( $this, \'wp_some_method\' ) );示例:

class SomeClass {
    public function __construct() {
        add_action( \'init\', array( $this, \'wp_some_method\' ) );
        echo \'__constructor<br />\';
    }
    function some_method(){
        throw new \\Exception(\'some message\');
    }
    function wp_some_method( $post_type ){
        throw new \\Exception(\'Some second error\'); 
    }
}
try{
    echo \'try <br />\';
    $o = new SomeClass();
    //$o->some_method(); - this throw exception correct

} catch (\\Exception $ex) {
    echo $ex->getMessage();
}
屏幕上显示:

try

__constructor

以及:Fatal error: Uncaught exception \'Exception\'

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

try{}catch(){}块不会捕获您的异常,因为它不会在try-catch块中抛出。这表明对异步事件和WordPress挂钩/动作/事件系统缺乏了解。

对象的方法附加到init操作挂钩,并在启动init挂钩时抛出,而不是在创建对象时抛出,也不是在附加它们时抛出。

e、 g。

class SomeClass {
    public function __construct() {
        // when the init action/event happens, call the wp_some_method
        add_action( \'init\', array( $this, \'wp_some_method\' ) );
    }
    function wp_some_method( $post_type ){
        throw new \\Exception(\'error\'); 
    }
}
try{
    // great, no exceptions where thrown while creating the object
    $o = new SomeClass();    
} catch (\\Exception $ex) {
    echo $ex->getMessage();
}

// a small period of time later somewhere in WP Core...

do_action( \'init\' ); // a method we attached to the init hook threw an exception, but nothing was there to catch it!
创建对象时不会调用方法。它附加到init事件是的,但没有调用它,正是因为“init”事件尚未发生。init事件发生在try{}catch语句运行很久之后。

因此,这些更合适:

在类方法中添加try-catch(最佳)不要在附加到挂钩/事件的函数中引发异常(甚至更好)将异常抛出到不是附加方法的新方法中,以便可以添加try-catch(好的,需要很好地分离关注点和抽象)

  • 添加全局错误处理程序(hackish,强烈反对,将花费比它的价值更多的时间,可能会捕捉到你从未打算捕捉到的其他异常)
  • 否则,没有理性、逻辑、常识的理由说明throw new \\Exception 应该像上面那样在try-catch块中执行,而不必像测试中那样手动调用它。

    结束

    相关推荐

    Displaying oEmbed errors?

    有时,通过oEmbed嵌入项目是不可能的,例如,当YouTube视频已禁用嵌入时。The oEmbed service will return a 401 Unauthorized, 并且不会转换代码。有没有办法通知用户这一点?当前的工作流是非直观的(至少对我来说),我更喜欢在WordPress页面上,或者更好的是,在编辑器中显示一条消息,说明对象无法嵌入。