Turbo Postado Março 5, 2004 Denunciar Share Postado Março 5, 2004 ae galera, já criei um tipo d exeção, chamada Erro, e quando alguém faz alguam coisa errada gostaria de q a mensagem de erro exibida seria a que essa classe possui.la no except eu colocoon Erro do showmessage(.....);e quando quero sinalizar este erro como faço ?!?! Valeu Pessoar.... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 bolomaster Postado Março 9, 2004 Denunciar Share Postado Março 9, 2004 não entendi muito bem você quer apontar qual o erro ou você quer apenas colocar tipo sinal nele? ok Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Turbo Postado Março 9, 2004 Autor Denunciar Share Postado Março 9, 2004 tipo assim, quando uma informação errada fosse inserida, explo.:o cara digitou uma data inválida, então quero levantar esse erro especifico, já usei o raise erro.create('mensagem');mas não deu certo porque ele para tudo e vai pro except e lá é q ele vefirica os erros.... e isso é um erro especifico, apenas em um form....Foi agora ou ainda não ?!?! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 bolomaster Postado Março 10, 2004 Denunciar Share Postado Março 10, 2004 Bem achei este artigo sobre o tratamento de erro, existia varios, so que este eu achei mais interessante olhe se é util a você abraços PS.: O Artigo foi retirado do Planeta Delphi (http://www.delphi.eti.br/) qualquer duvida é so entrar lá.Aplicações RobustasO tratamento de exceção é um mecanismo capaz de dar robustez a uma aplicação, permitindo que os erros sejam manipulados de uma maneira consistente e fazendo com que a aplicação possa se recuperar de erros, se possível, ou finalizar a execução quando necessário, sem perda de dados ou recursos.Para que uma aplicação seja segura, seu código necessita reconhecer uma exceção quando esta ocorrer e responder adequadamente a essa exceção. Se não houver tratamento para uma exceção, será exibida uma mensagem padrão descrevendo o erro e todos os processamentos pendentes não serão executados. Uma exceção deve ser respondida sempre que houver perigo de perda de dados ou de recursos do sistema.ExceçõesExceções são classes definidas pelo Delphi para o tratamento de erros. Quando uma exceção é criada, todos os procedimentos pendentes são cancelados e, geralmente é mostrada uma mensagem de erro para o usuário. As mensagens padrão nem sempre são claras, por isso é indicado criar seus próprios blocos protegidos.Blocos ProtegidosUm bloco protegido é um grupo de comandos com uma seção de tratamento de exceções.try A := StrToFloat(EdtA.Text); B := StrToFloat(EdtB.Text); ShowMessage(Format('%f / %f = %f', [A, B, A + B]));except ShowMessage('Números inválidos.');end;Algumas vezes você pode precisar especificar quais exceções quer tratar, como mostrado abaixo.try Soma := StrToFloat(EdtSoma.Text); NumAlunos := StrToInt(EdtNum.Text); ShowMessage(Format('Média igual a %f.', [soma / NumAlunos]));except on EConvertError do ShowMessage('Valor inválido para soma ou número de alunos.'); on EZeroDivide do ShowMessage('O número de alunos tem que ser maior que zero.'); else ShowMessage('Erro na operação, verifique os valores digitados.');end;Principais ExceçõesO Delphi define muitas exceções, para cada erro existe uma exceção correspondente. Classe Descrição Exception Exceção genérica, usada apenas como ancestral de todas as outras exceções EAbort Exceção silenciosa, pode ser gerada pelo procedimento Abort e não mostra nenhuma mensagem EAccessViolation Acesso inválido à memória, geralmente ocorre com objetos não inicializados EConvertError Erro de conversão de tipos EDivByZero Divisão de inteiro por zero EInOutError Erro de Entrada ou Saída reportado pelo sistema operacional EIntOverFlow Resultado de um cálculo inteiro excedeu o limite EInvalidCast TypeCast inválido com o operador as EInvalidOp Operação inválida com número de ponto flutuante EOutOfMemory Memória insuficiente EOverflow Resultado de um cálculo com número real excedeu o limite ERangeError Valor excede o limite do tipo inteiro ao qual foi atribuída EUnderflow Resultado de um cálculo com número real é menor que a faixa válida EVariantError Erro em operação com variant EZeroDivide Divisão de real por zero EDatabaseError Erro genérico de banco de dados, geralmente não é usado diretamente EDBEngineError Erro da BDE, descende de EDatabaseError e traz dados que podem identificar o erro Blocos de FinalizaçãoBlocos de finalização são executados sempre, haja ou não uma exceção. Geralmente os blocos de finalização são usados para liberar recursos.FrmSobre := TFrmSobre.Create(Application);try FrmSobre.Img.LoadFromFile('Delphi.bmp'); FrmSobre.ShowModal;finally FrmSobre.Release;end;Você pode usar blocos de proteção e finalização aninhadosFrmOptions := TFrmOptions.Create(Application);try FrmOptions.ShowModal; try Tbl.Edit; TblValor.AsString := EdtValor.Text; except on EDBEngineError do ShowMessage('Alteração não permitida.'); on EConvertError do ShowMessage('Valor inválido.'); end;finally FrmOptions.Release;end;Geração de ExceçõesVocê pode provocar uma exceção usando a cláusula raise.raise EDatabaseError.Create('Erro ao alterar registro.');Também é possível criar seus próprios tipos de exceções.type EInvalidUser = class (Exception); raise EInvalidUser.Create('Você não tem acesso a essa operação.');Se você quiser que uma exceção continue ativa, mesmo depois de tratada, use a cláusula raise dentro do bloco de tratamento da exceção. Geralmente isso é feito com exceções aninhadas.try Tbl.Edit; TblContador.Value := TblContador.Value + 1; Tbl.Post;except ShowMessage('Erro ao alterar contador.'); raise;end;Erros de Bancos de DadosA exceção EDBEngineError permite a identificação de erros de bancos de dados gerados pela BDE.try TblCli.Post;except on E: EDBEngineError do if E.Errors[0].ErrorCode = DBIERR_KEYVIOL then ShowMessage('Cliente já cadastrado.');end;Note que a variável E, que vai identificar o erro, só precisa ser declarada no bloco de tratamento da exceção. No help você pode consultar outras propriedades de EDBEngineError que podem ser importantes.Você também pode usar os eventos de erro do componente Table, sem precisar de blocos de tratamento.procedure TFrmCadCli.TblCliPostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);begin if(E is EDBEngineError) then with EDBEngineError(E) do case Errors[0].ErrorCode of DBIERR_KEYVIOL: ShowMessage('Cliente já cadastrado.'); DBIERR_REQDERR: ShowMessage('Campo obrigatório não preenchido.'); end else ShowMessage('Erro no banco de dados:' + #13#13 + E.Message); Action := daAbort;end;Alguns códigos de erro da BDE estão listados abaixo. Todas as constantes e funções relacionadas à API da BDE no Delphi 3 estão na Unit BDE, que deve ser adicionada à cláusula uses. No BDE API Help você pode encontrar referência sobre as funções nativas da BDE, como também alguns exemplos em Delphi. Constante Descrição DBIERR_KEYVIOL Violação de chave primária DBIERR_MAXVALERR Valor máximo excedido DBIERR_FORIEGNKEYERR Erro de chave externa, como em integridade referencial DBIERR_LOCKED Registro travado DBIERR_FILELOCKED Arquivo travado DBIERR_NETMULTIPLE Mais de um diretório usado como NetFileDir DBIERR_MINVALERR Campo com valor mais baixo que valor mínimo DBIERR_REQDERR Campo obrigatório faltando DBIERR_LOOKUPTABLEERR Erro em tabela Lookup Se você quiser mais informações a respeito do erro pode usar o procedimento DBIGetErrorContext, como na função mostrada abaixo que retorna determinadas informações sobre o erro.function GetErrorInfo(Context: SmallInt): string;begin SetLength(Result, DBIMAXMSGLEN + 1); try DbiGetErrorContext(Context, PChar(Result)); SetLength(Result, StrLen(PChar(Result))); except Result := ''; end;end;No evento OnEditError, usado no exemplo abaixo, se ocorrer um erro ao tentar alterar um registro, podemos identificar o usuário da rede que está alterando esse registro usando a função criada anteriormente.if Pos('locked', E.Message) > 0 then ShowMessage('Usuário ''' + GetErrorInfo(ecUSERNAME) + ''' está alterando o registro.');Note que foi usada uma outra técnica de identificação do erro, usando a própria mensagem de erro e não o código, como mostrado anteriormente. Você pode usar a função criada acima mandando como parâmetro os valores mostrados abaixo, que podem ser encontrados no help da BDE. Constante Descrição ecTABLENAME Nome da Tabela ecFIELDNAME Nome do campo ecUSERNAME Nome do usuário, muito usado para identificar qual usuário travou o registro ecFILENAME Nome do arquivo ecINDEXNAME Nome do índice ecDIRNAME Pasta ecKEYNAME Chave primária ecALIAS Alias ecDRIVENAME Drive ecNATIVECODE Código de erro nativo ecNATIVEMSG Mensagem de erro nativa ecLINENUMBER Número da linha, usado em instruções SQL Para desenvolver um sistema genérico de tratamento de erros, considere a opção de criar esse tratamento em um DataModule genérico para ser usado como ancestral por todos os DataModules do sistema, utilizando a herança visual.Se o único problema for traduzir as mensagens, localize os arquivos CONSTS.INT e DBCONSTS.INT e crie uma nova Unit de definição de strings com uma estrutura semelhante a mostrada abaixo e juntando todas as definições das constantes das duas Units devidamente traduzidas. Depois, basta usar essa Unit em seus projetos que as novas mensagens irão sobrepor as anteriores.unit NewConsts; interface resourcestring SAssignError = 'Não é possível atribuir %s a %s'; SFCreateError = 'Não é possível criar arquivo %s'; SFOpenError = 'Não é possível abrir arquivo %s'; SInvalidFieldSize = 'Tamanho de campo inválido'; SInvalidFieldRegistration = 'Registro de campo inválido'; SUnknownFieldType = 'Campo ''%s'' tem um tipo desconhecido'; implementation end.Uma outra opção seria criar um método para o evento OnException do objeto Application, esse método seria chamado sempre que houvesse uma exceção em qualquer parte do sistema.Adiconada dia: 14/08/03 às 09:29:53, por: Carlos Renato Pereira Zen Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Lmancini Postado Março 10, 2004 Denunciar Share Postado Março 10, 2004 tipo assim, quando uma informação errada fosse inserida, explo.:o cara digitou uma data inválida, então quero levantar esse erro especifico, já usei o raise erro.create('mensagem');mas não deu certo porque ele para tudo e vai pro except e lá é q ele vefirica os erros.... e isso é um erro especifico, apenas em um form....Foi agora ou ainda não ?!?! procedure TFrmPrincipal.Trataerros(Sender: TObject; E: Exception);var mensagem: string; Pos1, Pos2: integer;begin If Pos(UpperCase('is not a valid date'), UpperCase(E.Message)) <> 0 then showmessage('Data inválida, proceda a correção.') else if Pos(UpperCase('must have a value'), UpperCase(E.Message)) <> 0 then begin Pos1:=Pos('''', E.Message); mensagem:=E.Message; Delete(mensagem, Pos1, 1); Pos2:=Pos('''', mensagem); mensagem:=copy(E.Message, Pos1 + 1, Pos2 - Pos1); showmessage('É obrigatório o preenchimento do campo '+ mensagem + '.'); end else If Pos(UpperCase('key violation'), UpperCase(E.Message)) <> 0 then showmessage('Houve violação de Chave. Registro já incluido.') else If Pos(UpperCase('Input value'), UpperCase(E.Message)) <> 0 then showmessage('Campo preenchido com valor não válido. Proceda a correção.') else If Pos(UpperCase('is not a valid time'), UpperCase(E.Message)) <> 0 then showmessage('Hora inválida, proceda a correção.') else If Pos(UpperCase('master has detail records'), UpperCase(E.Message)) <> 0 then ShowMessage('Proibida a Exclusão e Modificação deste Registro, pois ele faz Referência a Outro(s) Registro(s)!') else If Pos(UpperCase('field value required'), UpperCase(E.Message)) <> 0 then Begin Pos1:=Pos(':',E.Message); Delete(Mensagem,Pos1,1); Mensagem:=copy(E.Message,Pos1+2,30); showmessage('É obrigatório o preenchimento do campo "'+ mensagem + '".'); End; If Pos(UpperCase('RECORD LOCKED BY ANOTHER USER.'), UpperCase(E.Message)) <> 0 then ShowMessage('O Registro está sendo Utilizado por Outro Usuário da Rede. Cancele a Operação e Aguarde a Liberação do Mesmo!') else showmessage('Ocorreu o seguinte erro: '+UpperCase(E.Message));end;procedure TFrmPrincipal.FormCreate(Sender: TObject);begin Application.OnException:=TrataErros;end;Ajudou ?Inté. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Turbo
ae galera,
já criei um tipo d exeção, chamada Erro, e quando alguém faz alguam coisa errada gostaria de q a mensagem de erro exibida seria a que essa classe possui.
la no except eu coloco
on Erro do
showmessage(.....);
e quando quero sinalizar este erro como faço ?!?!
Valeu Pessoar....
Link para o comentário
Compartilhar em outros sites
4 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.