2010-10-29 15 views
8

¿Es posible agregar un parámetro adicional al lanzar una excepción?excepciones php parámetros adicionales

Cuando lanzo una excepción, envío el mensaje de error pero también me gustaría enviar el nombre del campo en un parámetro adicional. Algo así como:

throw new Exception('this is an error message', 'the field'); 

Así que cuando puedo mostrar el mensaje que puede hacer algo como esto:

show_error($e->getFieldname, $e->getMessage()); 

Respuesta

18

No, tendría que subclass Exception con su propia aplicación y añadir ese método.

class FieldException extends Exception 
{ 
    protected $_field; 
    public function __construct($message="", $code=0 , Exception $previous=NULL, $field = NULL) 
    { 
     $this->_field = $field; 
     parent::__construct($message, $code, $previous); 
    } 
    public function getField() 
    { 
     return $this->_field; 
    } 
} 

Pero en realidad, no soy amigo de agregar métodos o propiedades a Excepciones. Una excepción representa exactamente eso: algo excepcional que sucedió en su aplicación. La propiedad "campo" realmente no es parte de la Excepción, pero es parte del mensaje de excepción, por lo que probablemente use un mensaje adecuado como:

Valor incorrecto para el campo foo. Cadena de excepción, número entero obtenido

+0

¿como lo uso? si lanzo una nueva FieldException ('mensaje', 'campo'); obtengo los parámetros incorrectos para la excepción – dazz

+1

@Dazz 'new FieldMessage ('mensaje', 0, NULL, 'campo')'. El constructor para excepciones requiere el mensaje, pero también permite dos argumentos opcionales. Cambiar el orden puede romper el manejo de excepciones en aplicaciones complejas donde se vuelven a lanzar excepciones, así que para asegurarse de que no se rompa nada, agregue su parámetro como el cuarto (si usa esa solución) – Gordon

+1

Tuve que omitir la parte anterior de la excepción $ eso es solo para php 5.3.0+ y yo usando 5.2.9. y en el campo de construcción $ this-> debería ser $ this -> _ field. Entonces funciona perfecto! Tnx – dazz

0

Puede implementar su propia clase de excepción y personalizarla.

Consulte el artículo Extending Exceptions para obtener más información.

1

Lo que hago, es tener una clase para crear excepciones personalizadas, pero para estandarizar las cosas, simplemente tengo un argumento adicional, que es un objeto (bueno, hasta ahora siempre ha sido una matriz), lo que me permite especificar cantidad ilimitada de datos de excepción (muy similar a una excepción de JavaScript).

Salida:

Fatal error: Uncaught SqlProxyException 'Duplicate entry '1' for key 'PRIMARY'' in  /usr/src/wrangler/trunk/common/SqlProxy.php(356) 
#0 /usr/src/wrangler/trunk/common/SqlProxy.php(341): SqlProxy::Update('INSERT into tes...') 
#1 /usr/src/wrangler/trunk/common/SqlProxy.php(455): SqlProxy::Insert('INSERT into tes...') 
#2 {main} 
Array 
(
[sql] => INSERT into test SET test='1' 
[errorObject] => Array 
    (
     [status] => UNKNOWN 
     [data] => Array 
      (
       [rowsAffected] => -1 
       [errorMsg] => Duplicate entry '1' for key 'PRIMARY' 
       [errorCode] => 1062 
.... 

Esto se logra mediante el siguiente en mi código: demasiado difícil

<? require_once "CustomException.php"; 

## Define the custom exception 
class SqlProxyException extends CustomException {} 

## Throw a custom exception 
throw new SqlProxyException($errorMsg, $errorCode, null, 
    array("sql" => $query, "errorObject" => $result) 
); 

## Catch the custom exception 

try { 
    SqlProxy::Insert($argv[2]); 
} catch (SqlProxyException $e) { 
    fprintf(STDERR, "Fatal error: Uncaught SqlProxyException '%s' in %s(%s)\n%s\n%s\n", 
     $e->getMessage(), $e->getFile(), $e->getLine(), 
     $e->getTraceAsString(), 
     $e->getObject() ? print_r($e->getObject(), 1) : "" 
    ); 
    exit(1); 
} 

No ... y la magia detrás de CustomException.php es

<?php 

interface IException 
{ 
    /* Protected methods inherited from Exception class */ 
    public function getMessage();     // Exception message 
    public function getCode();     // User-defined Exception code 
    public function getFile();     // Source filename 
    public function getLine();     // Source line 
    public function getTrace();     // An array of the backtrace() 
    public function getTraceAsString();   // Formated string of trace 

    /* Overrideable methods inherited from Exception class */ 
    public function __toString();     // formated string for display 
    public function __construct($message = null, $code = 0); 

} 

abstract class CustomException extends Exception implements IException 
{ 
    protected $message = 'Unknown exception';  // Exception message 
    private $string;       // Unknown 
    protected $code = 0;      // User-defined exception code 
    protected $file;        // Source filename of exception 
    protected $line;        // Source line of exception 
    protected $object = null;      // Extra information in an object (array) js style 
    private $trace;        // Unknown 

    public function __construct($message = null, $code = 0, Exception $previous = null, $eventObject = null) 
    { 
     if (!$message) { 
      throw new $this('Unknown '. get_class($this)); 
     } 
     parent::__construct($message, $code, $previous); 
     $this->object = $eventObject; 
    } 

    public function __toString() 
    { 
     return get_class($this) . " '{$this->message}' in {$this->file}({$this->line})\n" 
           . "{$this->getTraceAsString()}"; 
    } 

    /* Additional custom method */ 
    public function getObject()     // Return object (array) of extra info (js style) 
    { 
     return $this->object; 
    } 
} 
+0

'$ eventObject' debería ser presumiblemente' $ object' en tu constructor (o '$ object ['eventObject']')? Además, anular/redeclar las propiedades protegidas de la clase padre 'Excepción' parecería innecesario (por error)? – MrWhite

+0

@ w3d buena captura en $ eventObject. No estoy seguro sobre la redeclaración de las propiedades de Exception.Puede estar allí como documentación adicional para la clase Exception (o al menos, una lista de propiedades). Si hace que una función subyacente de Exception falle, entonces definitivamente sería un error. – Orwellophile

Cuestiones relacionadas