Extendiendo excepciones

Una clase de definición de excepciones del usuario puede ser definida extendiendo la clase de excepciones incorporado. Los miembros y propiedades mencionados en seguida, muestran lo que está accesible dentro de la clase "hijo" que se deriba de la clase de excepciones incorporados.


Ejemplo 20-2. La clase de excepciones incorporada
<?phpclass Exception{
    
protected $message 'Unknown exception';   // exception message
    
protected $code 0;                        // user defined exception code
    
protected $file;                            // source filename of exception
    
protected $line;                            // source line of exception

    
function __construct($message null$code 0);

    
final function getMessage();                // message of exception
    
final function getCode();                   // code of exception
    
final function getFile();                   // source filename
    
final function getLine();                   // source line
    
final function getTrace();                  // an array of the backtrace()
    
final function getTraceAsString();          // formated string of trace

    /* Overrideable */
    
function __toString();                       // formated string for display}?>

Si una clase se extiende de la clase Exception incorporada y redefine el constructor, es altamente recomendado que también llame parent::__construct() para asegurarse que todos los datos disponibles han sido asignados apropiadamente. El método __toString() puede ser evitado para proveer una salida personalizada cuando el objeto es presentado como una cadena.


Ejemplo 20-3. Extendiendo la clase Exception
<?php/**
* Define a custom exception class
*/
class MyException extends Exception{
    
// Redefine the exception so message isn't optional
    
public function __construct($message$code 0) {
        
// some code
  
        // make sure everything is assigned properly
        
parent::__construct($message$code);
    }

    
// custom string representation of object */
    
public function __toString() {
        return 
__CLASS__ ": [{$this->code}]{$this->message}\n";
    }

    
public function customFunction() {
        echo 
"A Custom function for this type of exception\n";
    }
}

/**
* Create a class to test the exception
*/
class TestException{
    
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:
                
// throw custom exception
                
throw new MyException('1 is an invalid parameter'5);
                break;

            case 
self::THROW_DEFAULT:
                
// throw default one.
                
throw new Exception('2 isnt allowed as a parameter'6);
                break;

            default:
                
// No exception, object will be created.
                
$this->var $avalue;
                break;
        }
    }
}

// Example 1try {
    
$o = new TestException(TestException::THROW_CUSTOM);
catch (MyException $e) {      // Will be caught
    
echo "Caught my exception\n"$e;
    
$e->customFunction();
catch (Exception $e) {        // Skipped
    
echo "Caught Default Exception\n"$e;
}
// Continue executionvar_dump($o);
echo 
"\n\n";

// Example 2try {
    
$o = new TestException(TestException::THROW_DEFAULT);
catch (MyException $e) {      // Doesn't match this type
    
echo "Caught my exception\n"$e;
    
$e->customFunction();
catch (Exception $e) {        // Will be caught
    
echo "Caught Default Exception\n"$e;
}
// Continue executionvar_dump($o);
echo 
"\n\n";

// Example 3try {
    
$o = new TestException(TestException::THROW_CUSTOM);
catch (Exception $e) {        // Will be caught
    
echo "Default Exception caught\n"$e;
}
// Continue executionvar_dump($o);
echo 
"\n\n";

// Example 4try {
    
$o = new TestException();
catch (Exception $e) {        // Skipped, no exception
    
echo "Default Exception caught\n"$e;
}
// Continue executionvar_dump($o);
echo 
"\n\n";?>

No response to “Extendiendo excepciones”