Detectar excepciones propias

2

Construyo algún paquete con mi propia excepción, pero cuando intento detectar una excepción, recibí un error fatal: Excepción no detectada . Esta situación es solo cuando el método con lanzamiento se pasa por add_action( 'init', array( $this, 'wp_some_method' ) ); Ejemplo:

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();
}

Se muestra en la pantalla:

try

__constructor

Y: Error grave: Excepción no detectada 'Excepción'

    
pregunta Michał Kalkowski 06.03.2014 - 18:40

1 respuesta

4

El bloque try {} catch () {} no captura su excepción, porque no se lanza dentro del bloque try catch. Esto demuestra una falta de comprensión de los eventos asíncronos y el sistema de enganche / acción / eventos de WordPress.

Los métodos de su objeto se adjuntan al enganche de acción de inicio y se lanzan cuando el enganche de inicio se activa, no cuando se crea el objeto, y no cuando se adjunta.

por ejemplo

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!

Su método no se llama cuando se crea su objeto. Se adjunta al evento init, sí, pero no se llama, precisamente porque el evento 'init' no ha ocurrido todavía. El evento de inicio ocurre mucho después de que se ejecute la instrucción try {} catch.

Entonces, en lugar de eso, esto sería más apropiado:

  • agregar un try catch en los métodos de clase (mejor)
  • No lanzar excepciones en funciones adjuntas a ganchos / eventos (aún mejor)
  • lance la excepción en un nuevo método que no sea el método que adjuntó para que pueda agregar una captura de prueba (está bien, requiere una buena separación de preocupaciones y abstracción)
  • agregue un controlador de errores global (hackish, fuertemente desaconsejado, tomará más tiempo de lo que vale, puede detectar otras excepciones que nunca tuvo la intención de atrapar)

De lo contrario, no hay una razón lógica, lógica o de sentido común, por la cual la línea de código que dice throw new \Exception debe ejecutarse dentro del bloque try catch como lo hizo anteriormente sin que usted lo llame manualmente como lo hizo en su prueba.

    
respondido por el Tom J Nowell 06.03.2014 - 21:37

Lea otras preguntas en las etiquetas