Excepciones Ampliar las Excepciones Una clase de Excepción definida por el usuario puede ser definida ampliando la clase Exception interna. Los miembros y las propiedades de abajo muestran lo que es accesible dentro de la clase hija que deriva de la clase Exception interna. La clase Exception Interna ]]> Si una clase extiende la clase Exception interna y redefine el constructor, se recomienda encarecidamente que también llame a parent::__construct() para asegurarse que toda la información disponible haya sido asignada apropiadamente. El método __toString() puede ser sobrescrito para proporcionar una salida personalizada cuando el objeto es presentado como un string. Las excepciones no se pueden clonar. Intentar clonar una Excepción resultará en un error E_ERROR fatal. Extender la clase Exception (PHP 5.3.0+) code}]: {$this->message}\n"; } public function funciónPersonalizada() { echo "Una función personalizada para este tipo de excepción\n"; } } /** * Crear una clase para probar la excepción */ class ProbarExcepción { public $var; const THROW_NONE = 0; const THROW_CUSTOM = 1; const THROW_DEFAULT = 2; function __construct($avalue = self::THROW_NONE) { switch ($avalue) { case self::THROW_CUSTOM: // lanzar la excepción personalizada throw new MiExcepción('1 no es un parámetro válido', 5); break; case self::THROW_DEFAULT: // lanzar la predeterminada. throw new Exception('2 no está permitido como parámetro', 6); break; default: // No hay excepción, el objeto se creará. $this->var = $avalue; break; } } } // Ejemplo 1 try { $o = new ProbarExcepción(ProbarExcepción::THROW_CUSTOM); } catch (MiExcepción $e) { // Será atrapada echo "Atrapada mi excepción\n", $e; $e->funciónPersonalizada(); } catch (Exception $e) { // Skipped echo "Atrapada la Excepción Predeterminada\n", $e; } // Continuar la ejecución var_dump($o); // Null echo "\n\n"; // Ejemplo 2 try { $o = new ProbarExcepción(ProbarExcepción::THROW_DEFAULT); } catch (MiExcepción $e) { // Este tipo no coincide echo "Atrapada mi excepción\n", $e; $e->funciónPersonalizada(); } catch (Exception $e) { // Will be caught echo "Atrapada la Excepción Predeterminada\n", $e; } // Continuar la ejecución var_dump($o); // Null echo "\n\n"; // Ejemplo 3 try { $o = new ProbarExcepción(ProbarExcepción::THROW_CUSTOM); } catch (Exception $e) { // Será atrapada echo "Atrapada la Excepción Predeterminada\n", $e; } // Continuar la ejecución var_dump($o); // Null echo "\n\n"; // Ejemplo 4 try { $o = new ProbarExcepción(); } catch (Exception $e) { // Saltado, sin excepción echo "Atrapada la Excepción Predeterminada\n", $e; } // Continuar la ejecución var_dump($o); // ProbarExcepción echo "\n\n"; ?> ]]> Las versiones de PHP 5, anteriores a PHP 5.3.0, no soportan excepciones anidadas. El siguiente fragmento de código se puede usar para reemplazar la clase MiExcepción si se desea ejecutar este ejemplo. code}]: {$this->message}\n"; } public function funciónPersonalizada() { echo "Una función personalizada para este tipo de excepción\n"; } } ?> ]]> PHP 5 tiene un modelo de excepciones similar al de otros lenguajes de programación. Una excepción puede ser lanzada ("&throw;n"), y atrapada ("&catch;ed") dentro de PHP. El código puede estar dentro de un bloque &try; para facilitar la captura de excepciones potenciales. Cada bloque &try; debe tener al menos un bloque &catch; o &finally; correspondiente. El objeto lanzado debe ser una instancia de la clase Exception o una subclase de Exception. Intentar lanzar un objeto que no lo sea resultará en un Error Fatal de PHP. <literal>catch</literal> Se pueden usar múltiples bloques &catch; para atrapar diferentes clases de excepciones. La ejecución normal (cuando no es lanzada ninguna excepción dentro del bloque &try;) continuará después del último bloque &catch; definido en la sencuencia. Las excepciones pueden ser lanzadas ("&throw;n") (o relanzadas) dentro de un bloque &catch;. Cuando una excepción es lanzada, el código siguiente a la declaración no será ejecutado, y PHP intentará encontrar el primer bloque &catch; coincidente. Si una excepción no es capturada, se emitirá un Error Fatal de PHP con un mensaje "Uncaught Exception ..." ("Excepción No Capturada"), a menos que se haya definido un manejador con set_exception_handler. <literal>finally</literal> En PHP 5.5 y posterior, se puede utilizar un bloque &finally; después o en lugar de los bloques &catch;. El código de dentro del bloque &finally; siempre se ejecutará después de los bloques &try; y &catch;, independientemente de que se haya lanzado una excepción o no, y antes de que la ejecución normal continúe. &reftitle.notes; Las funciones internas de PHP utilizan principalmente la Información de Errores, sólo las extensiones Orientadas a objetos modernas utilizan excepciones. Sin embargo, los errores se pueden traducir a excepciones simplemente con ErrorException. La Biblioteca Estádar de PHP (SPL) proporciona un buen número de excepciones internas. &reftitle.examples; Lanzar una Excepción getMessage(), "\n"; } // Continuar la ejecución echo 'Hola Mundo\n'; ?> ]]> &example.outputs; Manejo de excepciones con un bloque <literal>finally</literal> getMessage(), "\n"; } finally { echo "Primer finally.\n"; } try { echo inverse(0) . "\n"; } catch (Exception $e) { echo 'Excepción capturada: ', $e->getMessage(), "\n"; } finally { echo "Segundo finally.\n"; } // Continuar ejecución echo 'Hola Mundo\n'; ?> ]]> &example.outputs; Excepciones anidadas getMessage()); } } } $foo = new Prueba; $foo->probar(); ?> ]]> &example.outputs;