初学者问题:关于DELPHI的异常捕捉(50分)

  • 主题发起人 主题发起人 z1234
  • 开始时间 开始时间
Z

z1234

Unregistered / Unconfirmed
GUEST, unregistred user!

我在DELPHI中使用TRY与EXCEPT进行异常捕捉
在EXCEPT的ON中的错误如何得到。
例如:
我在添加数据库记录时因关键字重复程序报错:

'Key violation'我如何捕捉这一错误并使用
自己的出错信息替代。
 
inprise 中国公司竹叶www.inprise.com.cn 上一篇文章你看一下吧
 
找到你的出错信息是什么就行了。然后做相应的处理。
try
...
except
on EZeroDivide do HandleZeroDivide; //零做除数
on EOverflow do HandleOverflow; //溢出
on EMathError do HandleMathError; //计算出错
end;
你也可以把DELPHI自己的出错信息汉化,这样连替代都不用了,
报的错本身就是中文!查找一下以前的问题吧。
 
程序报错:Class EDBEngineError with message 'Key violation'
我无论写: on EDBEngineError Do ShowMessage('Error');
还是: on Key violation Do ShowMessage('Error');
都无法通过编译。
 
在IDE中运行
看看出的异常的名字
然后
try

except on xxxx

即可
 
用这一句就可以了:
try
...
except
on E: Exception do ErrorDialog(E.Message, E.HelpContext);
end;
 
我补充一下,try语句有这样几种形式:
try
statementList1
finally
statementList2
end;
语义:无论statementList1产生什么样的异常,statementList2都将
被执行.statementList2类似于灾情补救.但是异常会被抛出给Windows.
也就是说,会谈出一个错误对话框.
try
statementList1;
except
statementList2;
end
捕获所有的异常,执行statementList2;
try
statements
except
on Identifier1 do exceptionhandle1;
on Identifier2 do exceptionhandle2;
……
else
elsestatements;
end
或者
try
statements
except
on Identifier1:exceptiontype do exceptionhandle1;
on Identifier2:exceptiontype do exceptionhandle2;
else
elsestatements;
end;
捕获可能产生的异常,Identifier是异常变量.捕获异常后,
按照异常的类型,把异常的值复制到这个变量当中.执行exceptionghandle
else语句可选,捕获未再列表中的异常.
另外,还要指出,我们也可以引起异常,语句:
raise object at address
object可能是变量或者异常类型.
还有就是异常类型的定义...
这么多,我给你发一个文件吧,我的书的一部分,要吗?


 
其实,异常DELPHI本身是捕获了,只不过是因为
DELPHI本身的一些机制,所以你可能看到了不能
起作用的结果,你执行编译后的程序应该可以的。
 
首先感谢各位!
Wrench、Adminis:关于zjw的说法你们怎么看?
Lczhouhuo:你的回答非常详细,但我目前主要问题在与如何从DELPHI产生的异常中得
到可放入on···Do间的错误句柄正如zjw所说。当然您的文章我一定拜读,出书时
一定通知我,好冲去购买。(现在关于DELPHI有深度与实际意义的书太少了)
 
找找 EDBEngineError 在哪个单元定义的
包含进来即可

 
还是不明白,可以写一行源代码吗?
 
try
...
except
on E:Exception do if (E.Message='Key violation') then
showmessage('my message');
end;
 
on E:Exception do
if (E.Message='Key violation') then
showmessage('my message')
else
showmessage('Nothing')

程序显示:'Nothing'
怎么办?
 
抱歉是我大意,如果是if (E.Message='Key violation.')就解决了。
但是如果有多种错误不是需要一大堆if。
 
对于异常,建议使用 EXCEPTION类旧可以了。
 
try
...
except
on E:Exception do if (E is EDBEngineError) then
showmessage('my message');
end;
一般说来需要自己捕获的都是某一类的异常。
 
呵呵:
excetp
on e:EDBEngineError do
ShowMessage('kdf');
on e:anotherException do
showMessage('skdfj');
end;

比你的简单。
 
呵呵,你那个anotherException到底是什么?
人家要的是对于所有的异常如果是EDBEngineError就捕获,
而不是的话就放过去,或者说有针对性的,数据库的异常使用自己的
信息来显示,而别的信息不管。
还可以使用except的带else的形式,如前所述。
 
我需要的并不只是EDBEngineError这么简单,而是错误先是EDBEngineError然后还
要显示为何种EDBEngineError错误然后分别处理。
目前来看最好的答案是:
try
...
except
on E:Exception do if (E.Message='Key violation.') then
showmessage('my message')
else
(E.Message='Table is Buy')
showmessage('My message1')
......

end;
基本解决问题
但面对多个Message那只有使用许多的IF
总觉得不妥
 
后退
顶部