php: try-catch no captura todas las excepciones

Estoy tratando de hacer lo siguiente:

try {
    //just an example
    $time      = 'wrong datatype';
    $timestamp = date("Y-m-d H:i:s", $time);
} catch (Exception $e) {
    return false;
}
//database activity here

En resumen: inicializar algunas variables que se ponen en la base de datos. Si la inicialización falla por cualquier motivo – por ejemplo, porque $el tiempo no es el formato esperado – quiero que el método devuelve false y no de entrada de datos erróneos en la base de datos.

Sin embargo, los errores como este no son capturados por el ‘catch’-declaración, pero por el controlador de errores global.
Y, a continuación, el guión sigue.

Hay una forma de evitar esto? Sólo pensé que sería más limpio para hacerlo como esta en lugar de manualmente validación de tipos de cada variable, que parece ineficaz teniendo en cuenta que en el 99% de todos los casos no ocurre nada malo.

  • Eso es porque las excepciones no son universalmente implementado en PHP. Son un PHP5, además, y muy pocas de las funciones integradas, los tiren. En su lugar, usted tendrá que verificar los valores de retorno de la mayoría de las funciones.
InformationsquelleAutor Marcos | 2013-03-17

4 Kommentare

  1. 39

    Solución #1

    Uso ErrorException a su vez los errores en las excepciones para manejar:

    function exception_error_handler($errno, $errstr, $errfile, $errline ) {
        throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
    }
    set_error_handler("exception_error_handler");

    Solución #2

    try {
        //just an example
        $time      = 'wrong datatype';
        if (false === $timestamp = date("Y-m-d H:i:s", $time)) {
            throw new Exception('date error');
        }
    } catch (Exception $e) {
        return false;
    }
    • Un par de notas: 1) Si no desea universalmente elevar excepciones en lugar de errores en la aplicación, esto se puede lograr cuando se desee y regular el manejo de errores puede ser restaurado con restore_error_handler(). 2) espero que #2 todavía lanzar una advertencia. El mismo concepto se aplica: los informes de errores que puede ser cambiado con error_reporting() y volver después.
    • La advertencia DEBE SER tiró de todos modos. Ellos son la información que se debe guardar en un lugar. Si usted no quiere ver, sólo tiene que desactivar error_display
    • Fui con solución #1.
    • Solución #2 es cómo Js no se… es bueno si sabes lo que estás haciendo
    • Pregunta de seguimiento: Es una buena idea utilizar la solución #1 en sus aplicaciones de MVC? Me siento utilizando a nivel mundial en contra del propósito de las Excepciones, mientras que en repetidas ocasiones con restore_error_handler() se siente muy hackish.
    • Sólo en modo de depuración @VarunAgrawal, durante el desarrollo. No me había relé en un mundial de la opción de php para manejar correctamente cómo su aplicación en el hecho de correr en la final.
    • Gracias. Que en realidad es un argumento fuerte. Voy a permanecer lejos de estos en el futuro

  2. 45
    try {
      //call a success/error/progress handler
    } catch (\Throwable $e) { //For PHP 7
      //handle $e
    } catch (\Exception $e) { //For PHP 5
      //handle $e
    }
    • Gracias por este fragmento de código, que podría proporcionar cierta ayuda inmediata. explicación adecuada, mejoraría mucho su valor de largo plazo demostrando por qué es una buena solución para el problema y sería más útil para los lectores futuros con otras preguntas similares. Por favor, editar su respuesta a añadir alguna explicación, incluyendo las suposiciones que hemos hecho.
    • Oh, así que aquí es un fantasma que quita mi opinión !!! 😉 Pero aún así creo que algunas de las preguntas que puede tener una sola palabra de respuesta. ¿Cuál es la respuesta a la Pregunta 4 + 4? Una muy breve respuesta puede ser añadido sin explicación, sólo una palabra: 2, entonces ¿por qué tenemos que escribir: «La respuesta correcta a la 4 + 4 declaración que fue su pregunta fue de 2 …!» De nuevo, también estoy de acuerdo con las explicaciones más detalladas en las respuestas. Pero quiero decir, sólo algunos de ellos.
    • Esta respuesta breve es todo lo que necesitaba. Pero no estoy seguro de que 4 + 4 = 2.
    • Sí, esto está muy insuficientemente documentada, usted puede apenas notar que, si tienes suerte, y por lo tanto php.net/manual/en/class.error.php y php.net/manual/en/class.exception.php enlaces … porque el que debe contener este: php.net/manual/en/language.exceptions.phpaun no contienen la palabra Arrojadiza (en el doc parte).
  3. 8

    El más corto que he encontrado:

    set_error_handler(function($errno, $errstr, $errfile, $errline ){
        throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
    });

    Hace que todos los errores de convertirse en instancia de capturable ErrorException

  4. -1

    catch(Arrojadiza $e) obras
    catch ( Throwable $e){
    $msg = $e-> getMessage();
    }

    • Un poco de explicación sería agradable.
    • por favor, proporcione una explicación junto con su código.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea