Como atrapar error con try endtry...

496 views
Skip to first unread message

Douglas Sánchez

unread,
May 23, 2012, 11:25:26 AM5/23/12
to publice...@googlegroups.com
Hola que tal quiero implementar try endtry ya que yo capturo los errores de otra forma y me funciona pero segun he leido try catch es mejor,
pero resulta que me ignora y no me atrapa el error de nombre de la tabla cliente no existe ya que pongo Clientess con ss. desde ya muchas gracias
me gustaria algun concejo o recomendación. detallo codigo a continuación:


Set Classlib To Clas\conexiones
xcon = Createobject('oconexion')

xcon.iserver  = varserver
xcon.iport     = varpuerto
xcon.idatabase = vardatabase
xcon.iusername = varusername
xcon.ipassword = varpassword
xcon.Start(1) &&&&mysql 2 sqlserver 3 oracle 4 postgresql

If xcon.nhandle >= 1
    ?'Conexion establecida con el servidor...'
Else
    ?'Error al conectarse...'
Endif

Local lcErrMsg,sqlcad,outmsgline As Character
Local rsql As Integer
lcErrMsg= ' '
cadsql = 'select * from tblclientest order by idclientes'
Try
    rsql = SQLExec(xcon.nhandle,cadsql,'tmpclientes')
    Aerror(laErr)
    lcErrMsg = Substr(laErr[2],63,100)
Catch To loException  &&&& loException es ignorada no me atrapa nada de error.
    *** Si pongo este codigo aca me manda empty el lcErrMsg  pero como esta arriba si me funciona.
   lcErrMsg = Substr(laErr[2],63,100)
Finally
    IF !EMPTY(lcErrMsg)
        =Messagebox("Error: " + Chr(13) + lcErrMsg,'Error')
    ELSE
        =SQLDISCONNECT(xcon.nhandle)
    ENDIF
Endtry

Saludes

Pablo Daniel Lissa

unread,
May 23, 2012, 11:46:23 AM5/23/12
to Comunidad de Visual Foxpro en Español
Hola:

El tema es el siguiente: La excepción ocurre durante la ejecución de
SQLEXEC, por lo tanto, la ejecución del bloque se corta y pasa al
bloque CATCH sin ejecutar AERROR(laErr). Además, al querer acceder a
laErr[2] en el bloque CATCH, el arreglo no está definido, por lo que
se lanza otra excepción distinta. Yo te recomendaría lo siguiente:

TRY
rsql = SQLEXEC(xcon.nhandle,cadsql,'tmpclientes')
CATCH TO loException
lcErrMsg = loException.Message
FINALLY
IF !EMPTY(lcErrMsg)
=Messagebox("Error: " + Chr(13) + lcErrMsg,'Error')
ELSE
=SQLDISCONNECT(xcon.nhandle)
ENDIF
ENDTRY

Otra cosa a tener en cuenta... Si el error está en la consulta (no en
la conexión), SQLDISCONNECT se debería ejecutar igual. Eso lo dejo a
tu criterio.

Espero que te sirva. Saludos.
--------------------------------------------------------------------------------------------------
> Catch To* loException  &&&& loException es ignorada no me atrapa nada de

Douglas Sánchez

unread,
May 23, 2012, 1:18:21 PM5/23/12
to publice...@googlegroups.com
Gracias, pero me interesa mas capturar el error de los select insert , delete y update, pero si se pudiera  =Desconect() si en un caso pasa un error ahi, yo lo controlo distinto, pero trendia que abrir otro try endtry en azul eso es valido se pueden anidar varios try endtry????

Saludes.

 
TRY
   rsql = SQLEXEC(xcon.nhandle,cadsql,'tmpclientes')
CATCH TO loException
  lcErrMsg = loException.Message
FINALLY
   IF !EMPTY(lcErrMsg)
       =Messagebox("Error: " + Chr(13) + lcErrMsg,'Error')
   ELSE
  try
    resql   =SQLDISCONNECT(xcon.nhandle)
 endtry



--
Ing. Douglas Sánchez Guillén
      Consultor Informatico
Claro: 505 88495476

Pablo Daniel Lissa

unread,
May 23, 2012, 2:48:07 PM5/23/12
to Comunidad de Visual Foxpro en Español
Sí se pueden anidar. Solamente que tenés que respetar la estructura
básica completa (TRY - CATCH - ENDTRY... FINALLY es opcional), como si
anidaras IFs.

TRY
bloqueTRY1
CATCH
bloqueCATCH1
FINALLY
bloqueFINALLY1
TRY
bloqueTRY2
CATCH
bloqueCATCH2
ENDTRY
ENDTRY

Saludos.
---------------------------------------------------------------------------------
> *Ing. Douglas Sánchez Guillén*
> *      Consultor Informatico*
> Claro: 505 88495476

Victor Espina

unread,
May 23, 2012, 5:05:38 PM5/23/12
to publice...@googlegroups.com
El problema viene porque SQLEXEC() no dispara un error VFP si la intruccion SQL que se envio genero algun problema. En su lugar, devuelve un valor menor a cero, lo cual indica que el comando no se pudo ejecutar por alguna razon.  Para obtener la informacion del error, debes usar AERROR().

El codigo seria asi:

TRY
  rsql = SQLEXEC(nConn, cSQL)
  IF rsql < 0
   AERROR(...)
  ENDIF

CATCH TO ex   && Este catch capturaria cualquier otro error no relacionado con la instruccion SQL en si
  ...
ENDTRY

Lo que yo haria seria crear una funcion o metodo para enviar comandos remotos y que esta funcion o metodo me devuelta una cadena vacia u "OK" si todo salio bien o, en caso contrario, la descripcion del error.

Saludos

Victor Espina

Daniel Sánchez

unread,
May 24, 2012, 8:16:11 PM5/24/12
to publice...@googlegroups.com
Tal como comenta Víctor Espina el try catch no es disparado con sqlexec ya que si se envía una cadena el error se da en el servidor sql y no en el entorno vfp, para eso se analiza el valor devuelto por sqlexec y si es negativo se usa la función aerror(), con la que obtenemos los datos del error ocurrido en el servidor sql. 

Saludos


--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software & Sistemas
Móvil +051-949398047
Trujillo - Perú

Carlos Miguel FARIAS

unread,
May 25, 2012, 4:31:06 PM5/25/12
to publice...@googlegroups.com
En el caso de usar mysql, para saber exactamente que paso en el servidor (salvo un error de conexion), podes ejecutar la instruccion SHOW ERRORS que devuelve un cursor con dos columnas (codigo error y texto error).
Para probar, podes desde la ventana de comandos, crear una conexion, mandar un sqlexec con una instrucción errónea y luego mandar otra con la sentencia que te indique, y analizas el cursor devuelto.
Supongo que en los otros SGBD tenes comandos equivalentes para retornar el codigo de error mas reciente.
Saludos: Miguel, La Pampa (RA)
Reply all
Reply to author
Forward
0 new messages