2012-01-11 19 views
7

Así que tengo un mensaje de error que se tira en un archivoCómo lanzar una excepción matriz en PHP

$error_message = "Error received for " . $service . ": " . $_r['status'] . "\n" . "Message received: " . $_r['errors']; 
throw new My_Exception($error_message); 

y en otro archivo que tengo

try { 
    //blah blah 
} catch(My_Exception $e) { 
    var_export($e->getMessage()); 
} 

El problema, sin embargo, es que $ _r ['errors'] es un ARRAY y obtiene $ e-> getMessage() simplemente lo imprime como "Array". ¿Cómo puedo modificar este código para acceder a la matriz?

Respuesta

8

Para convertir una estructura de datos compleja como una matriz en una cadena (por ejemplo, para mensajes de error), se puede hacer uso de print_r­Docs y el establecimiento de su segundo parámetro a TRUE:

... ": " . print_r($_r['status'], TRUE) . "\n" ... 
14

El problema es que usted Estamos tratando de fusionar una matriz con una cadena. Siempre terminará así.

Quizás Debería pasar a la excepción una matriz, para que luego pueda hacer uso de ella?

<?php 
class myException extends Exception { 

    private $params; 

    public function setParams(array $params) { 
     $this->params = $params; 
    } 

    public function getParams() { 
     return $this->params; 
    } 
} 

// later it can be used like this: 
try { 
    $exception = new myException('Error!'); 
    $exception->setParams(array('status' => 1, 'errors' => array()); 

    throw $exception; 
} 
catch (myException $e) { 
    // ... 
} 
?> 
+0

Esto es malo, ya que rompe la interfaz básica de excepciones. Si necesita pasar algunos valores, solo agregue un método que los recopile y almacene. – Xeoncross

+0

@ Xeoncross Tienes razón. Lo arreglaré. – radmen

+1

+1 Perfecto. Ahora ese objeto está ganando, en lugar de perder, la funcionalidad. – Xeoncross

0

por lo que su código de ejemplo es un poco mal, pero asumiendo

$_r['errors'] = array(
    'Message 1', 
    'Message 2', 
    'Message 3', 
    'Message 4', 
    'Message 5', 
); 

Entonces

$error_message = "Error received for " . $service . ": \n" . impolode("\n", $_r['errors']) . "\n" . "Message received: " . $_r['errors']; 
throw new My_Exception($error_message); 

La clave está tomando su variedad de mensajes de error y la concatenación de todos ellos, junto con saltos de línea (o lo que sea)

Pero estoy un poco de acuerdo con el comentario de que puede estar usando el Exception fram ework mal. ¿Puedes publicar lo que estás tratando de hacer?

La regla general es que se lanza una excepción para cada evento único. No recopilas un montón de mensajes de error y luego los lanzas todos a la vez.

Cuestiones relacionadas