2012-01-27 16 views
53

Tengo una función PHP en un archivo Drupal 6 .module. Estoy intentando ejecutar validaciones de variables iniciales antes de ejecutar tareas más intensivas (como consultas de bases de datos). En C#, solía implementar sentencias IF al comienzo de mi bloque Try que arrojaba nuevas excepciones si fallaba una validación. La excepción arrojada quedaría atrapada en el bloque Catch. El siguiente es el código de PHP:Lanzar excepciones en un PHP Try Catch block

function _modulename_getData($field, $table) { 
    try { 
    if (empty($field)) { 
     throw new Exception("The field is undefined."); 
    } 
    // rest of code here... 
    } 
    catch (Exception $e) { 
    throw $e->getMessage(); 
    } 
} 

Sin embargo, cuando trato de ejecutar el código, me está diciendo que los objetos sólo pueden ser lanzadas dentro del bloque Catch.

¡Gracias de antemano!

+3

tl; dr "throw $ e-> getMessage();" debería ser "throw $ e;" –

Respuesta

78
function _modulename_getData($field, $table) { 
    try { 
    if (empty($field)) { 
     throw new Exception("The field is undefined."); 
    } 
    // rest of code here... 
    } 
    catch (Exception $e) { 
    /* 
     Here you can either echo the exception message like: 
     echo $e->getMessage(); 

     Or you can throw the Exception Object $e like: 
     throw $e; 
    */ 
    } 
} 
+1

Sí, ambas sugerencias dentro del bloque Catch resolverán mi problema. ¡Gracias! – kaspnord

0
throw $e->getMessage(); 

intenta lanzar una string

Como nota al margen: Las excepciones son por lo general para definir estados excepcionales de la aplicación y no hay mensajes de error después de la validación. No es una excepción, cuando un usuario le da datos inválidos

+0

¿Cuál sería una mejor manera de manejar validaciones? ¿Las declaraciones IF serían más apropiadas al manejar datos de usuario no válidos? – kaspnord

+0

En resumen: sí. En largo: trate la ocurrencia de argumentos inválidos como cualquier otra situación que pueda ocurrir en su aplicación y muestre otra página útil (error-). 'function validateField ($ validate) {return empty ($ validate);}' y en alguna parte por ejemplo 'if validateField ($ x) {echo" Field is empty ";} else {doSomethingUseful();}' – KingCrunch

+0

Veo, gracias para explicar – kaspnord

12

Simplemente elimine el throw del bloque catch - cámbielo a echo o solucione el error.

No te está diciendo que los objetos sólo pueden ser arrojados en el bloque catch, le está diciendo que únicos objetos puede ser lanzado, y la ubicación del error se encuentra en el bloque catch - hay una diferencia.

En el bloque catch estás tratando de lanzar algo que acabas de atrapar, que en este contexto tiene poco sentido de todos modos, y lo que estás tratando de lanzar es una cadena.

Una analogía del mundo real de lo que está haciendo es atrapar una pelota, y luego tratar de arrojar solo el logotipo del fabricante en otro lugar. Solo puedes lanzar un objeto completo, no una propiedad del objeto.

+0

Gracias por la aclaración. – kaspnord

48

Para volver a lanzar hacen

throw $e; 
no

el mensaje.

+0

Gracias, esta solución es la más adecuada para mis necesidades. – kaspnord

+0

Eso es lo que pensé, feliz de ayudar. –

+4

¿Retendría eso la información de la pila, o la sobrescribiría? – DanMan