2011-07-22 17 views

Respuesta

33

Claro. Solo dependerá de su código de manejo de errores tener en cuenta, y hacer uso de la propiedad de la matriz de forma adecuada. Se puede definir el constructor de la clase de excepción personalizada para tomar cualquier parámetro que desee y, a continuación, sólo asegúrese de llamar al constructor de la clase base desde dentro de la definición del constructor, por ejemplo:

class CustomException extends \Exception 
{ 

    private $_options; 

    public function __construct($message, 
           $code = 0, 
           Exception $previous = null, 
           $options = array('params')) 
    { 
     parent::__construct($message, $code, $previous); 

     $this->_options = $options; 
    } 

    public function GetOptions() { return $this->_options; } 
} 

Luego, en el código de llamada ...

try 
{ 
    // some code that throws new CustomException($msg, $code, $previousException, $optionsArray) 
} 
catch (CustomException $ex) 
{ 
    $options = $ex->GetOptions(); 
    // do something with $options[]... 
} 

Tener un vistazo a la documentación de PHP para extender la clase de excepción:

http://php.net/manual/en/language.exceptions.extending.php

+4

Oye, hombre, olvidaste 'extends Exception' :) –

2

Sí, se puede. Tendrá que extender el Exception class y crear un método __construct() para hacer lo que desee.

8

Creo que llegué demasiado tarde con una respuesta, pero también quería compartir mi solución. Probablemente hay más personas que buscan este :)

class JsonEncodedException extends \Exception 
{ 
    /** 
    * Json encodes the message and calls the parent constructor. 
    * 
    * @param null   $message 
    * @param int   $code 
    * @param Exception|null $previous 
    */ 
    public function __construct($message = null, $code = 0, Exception $previous = null) 
    { 
     parent::__construct(json_encode($message), $code, $previous); 
    } 

    /** 
    * Returns the json decoded message. 
    * 
    * @param bool $assoc 
    * 
    * @return mixed 
    */ 
    public function getDecodedMessage($assoc = false) 
    { 
     return json_decode($this->getMessage(), $assoc); 
    } 
} 
+3

añadiendo true como un segundo parámetro a json_decode devolverá una matriz, si omittd se devuelve un objeto –

0

Si no desea extender excepción, puede codificar la matriz en una cadena:

try { 
    throw new Exception(serialize(['msg'=>"Booped up with %d.",'num'=>123])); 
} catch (Exception $e) { 
    $data = unserialize($e->getMessage()); 
    if (is_array($data)) 
    printf($data['msg'],$data['num']); 
    else 
    print($e->getMessage()); 
} 

También puede utilizar json_encode/json_decode si tu prefieres.

Cuestiones relacionadas