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;
As 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ções
CLIQUE NA IMAGEM PARA AMPLIAR
Blocos 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 aninhados
FrmOptions := 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ções
provocando uma exceção utilizando 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 Dados
A 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; Action: TDataAction);
var
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.
CLIQUE NA IMAGEM PARA AMPLIAR
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.
CLIQUE NA IMAGEM PARA AMPLIAR
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";
iSInvalidFieldSize = "Tamanho de campo inválido"; SInvalidFieldRegistration = "Registro de campo inválido";
SUnknownFieldType = "Campo ""%s"" tem um tipo desconhecido";
implementation
end.