Manejo de excepciones en PHP

Una excepción es un resultado inesperado del programa que puede ser manejado por el propio programa. El manejo de excepciones en PHP es casi similar al manejo de excepciones en todos los lenguajes de programación.
PHP proporciona las siguientes palabras clave especializadas para este propósito.

  • try: Representa un bloque de código en el que puede surgir una excepción.
  • catch: representa un bloque de código que se ejecutará cuando se haya lanzado una excepción en particular.
  • throw: Se utiliza para lanzar una excepción. También se usa para enumerar las excepciones que lanza una función, pero que no se maneja sola.
  • finalmente: se usa en lugar del bloque catch o después del bloque catch, básicamente se coloca para la actividad de limpieza en el código PHP.

¿Por qué manejar excepciones en PHP?
Las siguientes son las principales ventajas del manejo de excepciones sobre el manejo de errores.

  • Separación del código de manejo de errores del código normal: en el código de manejo de errores tradicional siempre hay un bloque if else para manejar los errores. Estas condiciones y el código para manejar los errores se mezclaron, por lo que se vuelve ilegible. Con try Catch, el código del bloque se vuelve legible.
  • Agrupación de tipos de error: en PHP, tanto los tipos básicos como los objetos se pueden lanzar como excepción. Puede crear una jerarquía de objetos de excepción, agrupar excepciones en espacios de nombres o clases, categorizarlas según tipos.

Manejo de excepciones en PHP:

  • El siguiente código explica el flujo del bloque try catch normal en PHP:

    <?php
      
    // PHP Program to illustrate normal
    // try catch block code
    function demo($var) {
        echo " Before try block";
        try {
            echo "\n Inside try block";
                  
            // If var is zero then only if will be executed
            if($var == 0)
            {
                      
                // If var is zero then only exception is thrown
                throw new Exception('Number is zero.');
                      
                // This line will never be executed
                echo "\n After throw (It will never be executed)";
            }
        }
              
        // Catch block will be executed only 
        // When Exception has been thrown by try block
        catch(Exception $e) {
                echo "\n Exception Caught", $e->getMessage();
            }
              
            // This line will be executed whether
            // Exception has been thrown or not 
            echo "\n After catch (will be always executed)";
    }
      
    // Exception will not be rised
    demo(5);
      
    // Exception will be rised here
    demo(0);
    ?>
    Producción:

     Before try block
     Inside try block
     After catch (will be always executed)
     Before try block
     Inside try block
     Exception CaughtNumber is zero.
     After catch (will be always executed)
    
  • El siguiente código explica el flujo de prueba normal, captura y finalmente bloque en PHP

    <?php
      
    // PHP Program to illustrate normal
    // try catch block code
    function demo($var) {
          
        echo " Before try block";
        try {
            echo "\n Inside try block";
                  
            // If var is zerothen only if will be executed
            if($var == 0) {
                      
                // If var is zero then only exception is thrown
                throw new Exception('Number is zero.');
                      
                // This line will never be executed
                echo "\n After throw it will never be executed";
            }
        }
              
        // Catch block will be executed only 
        // When Exception has been thrown by try block
        catch(Exception $e) {
            echo "\n Exception Caught" . $e->getMessage();
        }
        finally {
            echo "\n Here cleanup activity will be done";
        }
              
        // This line will be executed whether
        // Exception has been thrown or not 
        echo "\n After catch it will be always executed";
    }
      
    // Exception will not be rised
    demo(5);
      
    // Exception will be rised here
    demo(0);
    ?>
    Producción:

     Before try block
     Inside try block
     Here cleanup activity will be done
     After catch (will be always executed)
     Before try block
     Inside try block
     Exception CaughtNumber is zero.
     Here cleanup activity will be done
     After catch (will be always executed)
    
  • Uso de la clase de excepción personalizada

    <?php
    class myException extends Exception {
        function get_Message() {
              
            // Error message
            $errorMsg = 'Error on line '.$this->getLine().
                        ' in '.$this->getFile()
            .$this->getMessage().' is number zero';
            return $errorMsg;
        }
    }
      
    function demo($a) {
        try {
          
            // Check if
            if($a == 0) {
                throw new myException($a);
            }
        }
          
        catch (myException $e) {
          
            // Display custom message
            echo $e->get_Message();
        }
    }
      
    // This will not generate any exception
    demo(5);
      
    // It will cause an exception
    demo(0);
    ?> 
    Producción:

    Error on line 20 in /home/45ae8dc582d50df2790517e912980806.php0 is number zero
    
  • Establecer un controlador de excepciones de nivel superior: la función set_exception_handler() establece todas las funciones definidas por el usuario en todas las excepciones no detectadas.

    <?php
      
    // PHP Program to illustrate normal
    // try catch block code
      
    // Function for Uncaught Exception
    function myException($exception) {
          
        // Details of Uncaught Exception
        echo "\nException: " . $exception->getMessage();
    }
      
    // Set Uncaught Exception handler
    set_exception_handler('myException');
    function demo($var) {
          
        echo " Before try block";
        try {
            echo "\n Inside try block";
                  
            // If var is zero then only if will be executed
            if($var == 0)
            {
                      
                // If var is zero then only exception is thrown
                throw new Exception('Number is zero.');
                      
                // This line will never be executed
                echo "\n After throw (it will never be executed)";
            }
        }
              
        // Catch block will be executed only 
        // When Exception has been thrown by try block
        catch(Exception $e) {
            echo "\n Exception Caught", $e->getMessage();
        }
              
        // This line will be executed whether
        // Exception has been thrown or not 
        echo "\n After catch (will be always executed)";
              
        if($var < 0) { 
              
            // Uncaught Exception
            throw new Exception('Uncaught Exception occurred');
        }
    }
      
    // Exception will not be rised
    demo(5);
      
    // Exception will be rised here
    demo(0);
      
    // Uncaught Exception
    demo (-3);
    ?>
    Producción:

     Before try block
     Inside try block
     After catch (will be always executed)
     Before try block
     Inside try block
     Exception CaughtNumber is zero.
     After catch (will be always executed)
     Before try block
     Inside try block
     After catch (will be always executed)
     Exception: Uncaught Exception occurred
    

Publicación traducida automáticamente

Artículo escrito por ankit15697 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *