try/catch X erro by Zero

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
juniorcamilo
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 10 Nov 2006 09:12
Localização: Pará

try/catch X erro by Zero

Mensagem por juniorcamilo »

boa tarde
utilizando try catch, como tratar o erro by zero?
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

try/catch X erro by Zero

Mensagem 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
//----------------------------------------------------------------------------------------  
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

try/catch X erro by Zero

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

try/catch X erro by Zero

Mensagem 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
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
juniorcamilo
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 10 Nov 2006 09:12
Localização: Pará

try/catch X erro by Zero

Mensagem 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).............
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

try/catch X erro by Zero

Mensagem por JoséQuintas »

Você sabe aonde dá erro?

Código: Selecionar todos

IF x == 0
   resultado = 0
ELSE
   resultado = numero / x
ENDIF
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
juniorcamilo
Usuário Nível 3
Usuário Nível 3
Mensagens: 343
Registrado em: 10 Nov 2006 09:12
Localização: Pará

try/catch X erro by Zero

Mensagem 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!!
Responder