FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Control de Errores
Posts: 149
Joined: Mon Oct 10, 2005 09:30 AM
Control de Errores
Posted: Sun Jul 22, 2012 06:56 PM
En este c贸digo

Code (fw): Select all Collapse
#include "FiveWin.ch"

function Main()

   local oError
   local oBlock

   ? ( 2 / 0 )

   oBlock            := ErrorBlock( { | oError | Break( oError ) } )
   BEGIN SEQUENCE

   ? ( 2 / 0 )

   RECOVER USING oError

      msgStop( oError:Description, "Error" )

   END SEQUENCE

   ErrorBlock( oBlock )

return nil


El primer mensaje me muestra 0, pero si esa operaci贸n ocurre dentro de un bloque de control de errores, el programa la desv铆a hacia el bloque RECOVER USING, realmente esto esta bien, pero en mi caso no quiero q por divisiones por cero esto ocurra, o sea q no se capture esa operaci贸n como error, como puedo hacerlo?

Saludos
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: Control de Errores
Posted: Mon Jul 23, 2012 07:34 AM
Manuel,

La soluci贸n es:
<<
Una vuelta de tuerca a lo anterior puede ser la siguiente:

Imag铆nense que no hemos protegido "manualmente" nuestro codigo contra las divisiones por cero; imag铆nense que tienen un c贸digo cr铆tico que de ninguna manera debe fallar y por eso lo protegemos con un BEGIN SEQUENCE:

CODE: SELECT ALL EXPAND VIEW

bErrorBlock:= ErrorBlock( {|oError| Break(oError) } )
BEGIN SEQUENCE
...(1)
RECOVER USING oError
...(2)
END
ErrorBlock(bErrorBlock)



Pues bien, lo anterior provocar谩 una deviaci贸n del flujo hacia el RECOVER si en las operaciones del ...(1) hay una operacion de division por cero, porque el tratamiento por defecto (ErrorSys) de la division por cero no se aplica aqui.

La soluci贸n es:
CODE: SELECT ALL EXPAND VIEW

bErrorBlock:= ErrorBlock( {|oError| If(oError:GenCode == EG_ZERODIV, 0, Break(oError)) ) )
BEGIN SEQUENCE
...(1)
RECOVER USING oError
...(2)
END
ErrorBlock(bErrorBlock)


>>

Desde el hilo http://forums.fivetechsupport.com/viewtopic.php?f=6&t=22561&start=0&hilit=hmpaquito

Saludos
Posts: 149
Joined: Mon Oct 10, 2005 09:30 AM
Re: Control de Errores
Posted: Mon Jul 23, 2012 09:52 AM

Gracias por el aporte, muy bueno

Yo lo he solucionado bas谩ndome en tu idea pero de esta manera

oBlock := ErrorBlock( { | oError | ApoloBreak( oError ) } )
BEGIN SEQUENCE
...

//--------------------------------------------------------------------------//

Function ApoloBreak( oError )

Return ( if( oError:GenCode == EG_ZERODIV, 0, Break( oError ) ) )

//---------------------------------------------------------------------------//

Y me va muy bien.

Saludos.

Continue the discussion