Foros del Web » Programando para Internet » PHP » CodeIgniter »

Problema con try catch

Estas en el tema de Problema con try catch en el foro de CodeIgniter en Foros del Web. Hola a todos, Les comento mi problema, el asunto es que tengo un array con una gran cantidad de datos que quiero ingresar a una ...
  #1 (permalink)  
Antiguo 17/08/2011, 16:53
Avatar de quike88  
Fecha de Ingreso: agosto-2008
Mensajes: 471
Antigüedad: 13 años, 4 meses
Puntos: 87
Problema con try catch

Hola a todos,

Les comento mi problema, el asunto es que tengo un array con una gran cantidad de datos que quiero ingresar a una tabla en mi BD, el problema es que algunas filas del array me dan error, ya sea por tener un tipo de dato diferente al definido en la columna o porque no tiene datos y esa columna no acepta NULL.

Entonces se me ocurrio usar try/catch (que no había usado antes) para atrapar esos errores y evitar que el proceso se interrumpa, lo que hice es esto para probar si funcionaba:

Código PHP:
foreach ($array() as $row) {
    try {
        if (!
$this->db1->insert("tabla"$row)) {
            throw new 
Exception('error en fila '.$row['NUMROW']);
        } else {
            echo 
'Fila '.$row['NUMROW'].' insertada correctamente <br />';    
        }
    } catch (
Exception $e) {
        echo 
'Excepción capturada: ',  $e->getMessage(), " <br />";    
    }

Pero cuando llega a la fila que da problemas, me sale un error "Ocurrió un Error con la Base de Datos..." y se detiene el proceso.

Estoy usando mal try/catch? o es un problema con la manipulación del errores del CI? Espero que puedan darme un mano con este problema.

Gracias.
  #2 (permalink)  
Antiguo 17/08/2011, 17:09
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 13 años, 5 meses
Puntos: 1532
Respuesta: Problema con try catch

según tengo entendido CI es compatible con PHP POO versión 4 la cual no incluye excepciones, consulta la API de CI para ver que devuelve $this->db1->insert() en caso de error
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 17/08/2011, 22:02
Avatar de NUCKLEAR
Moderador radioactivo
 
Fecha de Ingreso: octubre-2005
Ubicación: Cordoba-Argentina
Mensajes: 5.688
Antigüedad: 16 años, 2 meses
Puntos: 890
Respuesta: Problema con try catch

Podrias usar profiles http://codeigniter.com/user_guide/ge...profiling.html
Pero no entiendo la consulta, si te da error por que no coincide el tipo de campo con lo que le envias... O si no permite null y no le envias nada... Ya sabes donde esta el error, CI te deberia imprimir esos errores...
O lo mas rapido es activar los logs http://codeigniter.com/user_guide/general/errors.html Fijate al final..

Saludos.
__________________
Drupal Argentina
  #4 (permalink)  
Antiguo 18/08/2011, 08:38
Avatar de quike88  
Fecha de Ingreso: agosto-2008
Mensajes: 471
Antigüedad: 13 años, 4 meses
Puntos: 87
Respuesta: Problema con try catch

Gracias por las respuestas. NUCKLEAR, efectivamente se donde esta el error y CI me lo imprime, pero lo que busco es que por mas que aparezca un error igual se siga ejecutando el bucle y complete los demás insert.

maycolalvarez, $this->db->insert() te devuelve TRUE en caso de que se ejecute correctamente la inserción y FALSE caso contrario.

Al parecer el problema esta en la clase de base de datos del CI, que te lanza el error antes de devolver FALSE. Si desactivo db_debug en config/database.php funciona de la forma que quiero pero no se si es lo adecuado o hay otra forma de hacer esto.

Saludos!
  #5 (permalink)  
Antiguo 18/08/2011, 10:14
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 13 años, 5 meses
Puntos: 1532
Respuesta: Problema con try catch

me imagino que dependerá de si CI implementa un entorno (environment) para desarrollo o producción, si estás desde producción el error no debe aparecer, en cambio debe producir un error genérico tipo HTTP 5xx, porque mostrar errores en producción es un grave fallo de seguridad.

como te indica @nucklear, para eso tenemos los log's, para verificar el error y corregirlo, como te indique anteriormente si el fallo es grave el FW ha de producir en producción un error fatal
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #6 (permalink)  
Antiguo 18/08/2011, 10:30
Avatar de quike88  
Fecha de Ingreso: agosto-2008
Mensajes: 471
Antigüedad: 13 años, 4 meses
Puntos: 87
Respuesta: Problema con try catch

Gracias por tu respuesta, como sugirió NUCKLEAR activé los log's para poder revisar ahí se hubo algún error en la carga de los datos.

Gracias por su ayuda.

Saludos!
  #7 (permalink)  
Antiguo 24/08/2011, 01:18
Avatar de Smolky  
Fecha de Ingreso: mayo-2006
Ubicación: Cartagena
Mensajes: 177
Antigüedad: 15 años, 8 meses
Puntos: 14
Respuesta: Problema con try catch

Hola. Un aporte:

Dices que tienes gran cantidad de datos y todo lo estás insertando en la misma tabla. ¿Cierto? Entiendo que de la forma que lo estás haciendo estás realizando una consulta por cada dato que deseas insertar lo cual puede llegar a hacer estragos en la base de datos.

La idea sería crear un nuevo array de datos con los datos preparados para la inserción (eliminados los NULL y los que no tienen ese valor)

Mira el ejemplo de $this->db->insert_batch(); en el siguiente enlace
http://codeigniter.com/user_guide/da...rd.html#insert

Por otra parte, y esto si que puede sonar un poco quisquilloso, estás usando excepciones para "controlar" el flujo del programa. lo cual no es una práctica muy recomendable.

¿No es más lógico hacer esto?
Código PHP:
foreach ($array() as $row

  try 
  { 
    if (!
$this->db1->insert("tabla"$row)) 
    { 
      echo 
'Error en la fila...<br />' ;
    }
    else 
    { 
      echo 
'Fila insertada correctamente...<br />' 
    } 
  }


Un cordial saludo
__________________
No hay cuerda desafinada sino músico progresivo
  #8 (permalink)  
Antiguo 24/08/2011, 08:24
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 15 años, 7 meses
Puntos: 2135
Respuesta: Problema con try catch

@Smolky,

¿Cuando usar excepciones para controlar el flujo del programa es no recomendable? De hecho es una de las mejores herramientas que tienes cuando estas programando en POO, porque puedes definir exactamente el flujo que requieres de tu programa, y controlar los errores.

La persona que te dijo que no es lo más recomendable, seguramente no tiene un background fuerte en POO, ya que todos los lenguajes que son 100% POO, usar precisamente excepciones para controlar el flujo del programa.

Es una de las "desventajas" de PHP, que las funciones nativas no generan excepciones que podamos controlar a nivel código.

Saludos.
  #9 (permalink)  
Antiguo 24/08/2011, 10:09
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 14 años
Puntos: 845
Respuesta: Problema con try catch

Me extraña la pregunta GatorV, como comenta Smolky utilizar excepciones para controlar el flujo es generalmente considerado una mala practica, pero esto no es algo nuevo, yo tengo esta idea desde que trabajaba con Java(hace muuuuucho tiempo).

No es lo mismo lanzar una excepción porque la conexión a la bbdd falla, a lanzar una excepción porque el login no es correcto, esto último es lo que se considera dañino y es como no se debería utilizar una excepción.

A ver que esto se puede poner interesante
__________________
http://es.phptherightway.com/
thats us riders :)
  #10 (permalink)  
Antiguo 24/08/2011, 11:16
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 15 años, 7 meses
Puntos: 2135
Respuesta: Problema con try catch

Yo lo veo de otra manera, y es que depende también como hagas la excepción, pero por ejemplo, el login, es algo sencillo:
Código PHP:
Ver original
  1. try {
  2.       $myLoginService->login($user, $pass);
  3.       $this->createLocalSession($user);
  4.       $this->redirect('/panel');
  5. } catch (LoginException $ex) {
  6.       Logger::log($ex);
  7.       switch ($ex->getCode()) {
  8.       case 1: // not found
  9.              $sErrorMessage = 'No se encontro el usuario';
  10.              break;
  11.       case 2: // bad password
  12.              $sErrorMessage = 'Password incorrecto';
  13.              break;
  14.       }
  15. } catch (SessionException ($ex) {
  16.       if ($ex->getCode() == 5) { // Por ejemplo que el disco esta lleno y no hay espacio
  17.            Alerts::dispatchAlert($ex, 'Error en disco');
  18.            $sErrorMessage = 'Error en disco';
  19.            $this->redirect('/');
  20.       }
  21.  
  22.       Logger::log($ex);
  23.       $sErrorMessage = 'Error al crear la sesión';
  24. }

De esta forma tienes un mejor control sobre lo que el código puede generar, aunque claro puede esto llegar a muy malos habitos, la idea es controlar exactamente que excepcion esperas encontrar, ya que como dices muchos programadores de Java, tienden a solamente throw new Exception() y se acabo y es casi lo mismo que el Goto.

Es por eso que por ejemplo Zend define un tipo de excepción por cada paquete, para que puedas controlar específicamente que error esperas encontrar, y tengas una mejor forma de mostrar errores al usuario, logear, enviar alertas, etc. en lugar de presentar una pantalla en blanco cuando ocurre un error.
  #11 (permalink)  
Antiguo 24/08/2011, 12:13
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 14 años
Puntos: 845
Respuesta: Problema con try catch

Para mi son cosas diferentes, una cosa es el control granular de excepciones(algo con lo que estoy totalmente de acuerdo) y otra muy diferente el control del flujo del programa a traves de las exepciones, en el ejemplo que muestras, para mi LoginException no deberia ser una excepcion, que falle el login por que el usuario ha puesto mal los datos es algo normal y esperable, sin embargo que el disco este lleno y no se puedan guardar mas sesiones es un caso excepcional y como tal deberia lanzar la excepción(valga la redundancia) correspondiente(SessionException).

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #12 (permalink)  
Antiguo 24/08/2011, 14:20
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 15 años, 7 meses
Puntos: 2135
Respuesta: Problema con try catch

Cierto, ahora que lo pienso más tienes razón en lo que dices, la excepción por la misma palabra debe de ser por casos excepcionales, y entrando más a detalle así debe de ser
  #13 (permalink)  
Antiguo 29/08/2011, 09:18
Avatar de Smolky  
Fecha de Ingreso: mayo-2006
Ubicación: Cartagena
Mensajes: 177
Antigüedad: 15 años, 8 meses
Puntos: 14
Respuesta: Problema con try catch

Cita:
Iniciado por GatorV Ver Mensaje
Cierto, ahora que lo pienso más tienes razón en lo que dices, la excepción por la misma palabra debe de ser por casos excepcionales, y entrando más a detalle así debe de ser
Exacto, a eso mismo me refería. Sólo usarlas para esos casos excepcionales.
__________________
No hay cuerda desafinada sino músico progresivo

Etiquetas: catch, frameworks-y-php-orientado-a-objetos, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 05:18.