Clipper On Line • Ver Tópico - try/catch X erro by Zero

try/catch X erro by Zero

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

Moderador: Moderadores

 

try/catch X erro by Zero

Mensagempor juniorcamilo » 31 Out 2018 15:28

boa tarde
utilizando try catch, como tratar o erro by zero?
Avatar de usuário

juniorcamilo
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 343
Data de registro: 10 Nov 2006 08:12
Cidade/Estado: Pará
Curtiu: 29 vezes
Mens.Curtidas: 2 vezes

try/catch X erro by Zero

Mensagempor alxsts » 31 Out 2018 18:00

Olá!

Supondo que tenha se referido a "divide by zero", segue um exemplo:
/* 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)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

try/catch X erro by Zero

Mensagempor JoséQuintas » 31 Out 2018 22:10

Coisa antiga do clipper, tá na minha errorsys.

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

try/catch X erro by Zero

Mensagempor alxsts » 31 Out 2018 23:00

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)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

try/catch X erro by Zero

Mensagempor juniorcamilo » 01 Nov 2018 06:52

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?
function ErrorSys()
Public cQual := "2"
  ErrorBlock( {|e| DefError(e)} )
return
func DefError(e).............
Avatar de usuário

juniorcamilo
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 343
Data de registro: 10 Nov 2006 08:12
Cidade/Estado: Pará
Curtiu: 29 vezes
Mens.Curtidas: 2 vezes

try/catch X erro by Zero

Mensagempor JoséQuintas » 01 Nov 2018 08:55

Você sabe aonde dá erro?

IF x == 0
   resultado = 0
ELSE
   resultado = numero / x
ENDIF
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

try/catch X erro by Zero

Mensagempor juniorcamilo » 01 Nov 2018 08:59

JoséQuintas escreveu:Você sabe aonde dá erro?

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!!
Avatar de usuário

juniorcamilo
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 343
Data de registro: 10 Nov 2006 08:12
Cidade/Estado: Pará
Curtiu: 29 vezes
Mens.Curtidas: 2 vezes




Retornar para Harbour

Quem está online

Usuários vendo este fórum: Google [Bot] e 8 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro