Página 1 de 1

try/catch X erro by Zero

Enviado: 31 Out 2018 15:28
por juniorcamilo
boa tarde
utilizando try catch, como tratar o erro by zero?

try/catch X erro by Zero

Enviado: 31 Out 2018 18:00
por alxsts
Olá!

Supondo que tenha se referido a "divide by zero", segue um exemplo:

Código: Selecionar todos

/* TRY / CATCH / FINALLY / END */
#xcommand TRY => BEGIN SEQUENCE WITH __BreakBlock()
#xcommand CATCH [<!oErr!>] => RECOVER [USING <oErr>] <-oErr->
#xcommand FINALLY => ALWAYS

#include "inkey.ch"

Procedure Main
   
   LOCAL x, y, oErr, GetList := {}
   
   EXTERNAL HB_LANG_PT
   EXTERNAL HB_CODEPAGE_PTISO
   
   HB_LangSelect( "PT" )
   hb_cdpSelect( "PTISO" )

   SetMode(25,80)
   CLS

   While LastKey() != K_ESC
      Try
         x := 0
         y := 0

         @10, 10 Say "Entre valor 1:"  Get x Pict "9999"
         @11, 10 Say "Entre valor 2:"  Get y Pict "9999"

         READ

         If LastKey() != K_ESC
            @13, 10 Say "Valor 1 / valor 2:"  + Str(x/y)
         Endif

      Catch oErr
         // tratamento genérico
         ErrShow( oErr )

         // tratamento de um erro específico
         If oErr:subsystem == "BASE" .AND. oErr:subcode = 1340
            hb_Alert( { "Ocorreu um Erro.", "", "Divisão por zero", "", ;
                        "Descrição: " + LTrim(Str(oErr:genCode))  + " " + oErr:description } )
         Endif   

         // criando seu próprio objeto erro...
         oErr := ErrorNew()
         oErr:Args          := {}
         oErr:CanDefault    := .F.
         oErr:CanRetry      := .F.
         oErr:CanSubstitute := .T.
         oErr:Description   := "erro criado agora"
         oErr:GenCode       := 99999
         oErr:Operation     := '?'
         oErr:Severity      := 2
         oErr:SubCode       := 9999
         oErr:SubSystem     := "DUMMY"

         Try
            // disparando seu próprio objeto erro...
            BREAK (oErr)
         Catch
            ErrShow( oErr )
         End Try
      End Try
   Enddo

   RETURN
//----------------------------------------------------------------------------------------

STATIC PROCEDURE ErrShow( oErr )

   hb_Alert( { "Ocorreu um Erro.", "", ;
               "Erro: " + oErr:subsystem + "/" + LTrim(Str(oErr:subcode)),  ;
               "Descrição: " + LTrim(Str(oErr:genCode))  + " " + oErr:description, ;
               "Operação: " + oErr:operation ;
             } ;
            )
   RETURN
//----------------------------------------------------------------------------------------  

try/catch X erro by Zero

Enviado: 31 Out 2018 22:10
por JoséQuintas
Coisa antiga do clipper, tá na minha errorsys.

Código: Selecionar todos

STATIC FUNCTION JoseQuintasError( e )

   LOCAL nCont, cMessage, aOptions, nChoice

   // by default, division by zero yields zero
   IF ( e:GenCode == EG_ZERODIV )
      RETURN ( 0 )
   ENDIF

try/catch X erro by Zero

Enviado: 31 Out 2018 23:00
por alxsts
Olá!

Lembro-me deste código no Errorsys padrão. O Clipper optou por retornar zero? Acho que dá erro também. Não me lembro. É uma das possibilidades existentes, A maioria das linguagens retorna erro.
Divisão por zero

try/catch X erro by Zero

Enviado: 01 Nov 2018 06:52
por juniorcamilo
bom dia!!
entendi oq foi postado!!
então o exemplo do amigo alxsts não teria como retornar "0" e seguir o curso normal do prog. , ou seja, igual conseguimos fazer com o errorsys?

Código: Selecionar todos

function ErrorSys()
Public cQual := "2"
  ErrorBlock( {|e| DefError(e)} )
return
func DefError(e).............

try/catch X erro by Zero

Enviado: 01 Nov 2018 08:55
por JoséQuintas
Você sabe aonde dá erro?

Código: Selecionar todos

IF x == 0
   resultado = 0
ELSE
   resultado = numero / x
ENDIF

try/catch X erro by Zero

Enviado: 01 Nov 2018 08:59
por juniorcamilo
JoséQuintas escreveu:Você sabe aonde dá erro?

Código: Selecionar todos

IF x == 0
   resultado = 0
ELSE
   resultado = numero / x
ENDIF
sim sei!! mas como estou migrando o sistema clipper para harbour!! então provavelmente pode ocorrer em vários lugares(inviável sair procurando)!!
como o try é um recurso excelente achei q teria jeito de atribuir exceções para não parar a execução!!