请问各位所有的错误处理方法!300分!(300分)

  • 主题发起人 主题发起人 章慧
  • 开始时间 开始时间

章慧

Unregistered / Unconfirmed
GUEST, unregistred user!
要开始启动 做一个大型的系统工具软件,但是苦于不知道怎样控制出错处理
请指教!
1) 比如说上次提问写的InfoTip组件,在应用软件读取文件时,此Com组件就要出错
并导致Explorer关闭。
; ; 友人说:Try Finally Exception 只是积累错误,不是解决错误
请问这是真的吗?如何解决呢?
2) 尝试SetErrorMode(critic.....)和SetLastError(0)也不行
; ; 再关上Compiler的I/O check,所有的关键部位都被"{$-} {$+}"括住,
; ; 依然会在打开文件时,让系统弹出“I/O error 6" 或者 “File Aceess denied"
请问如何解决?
; ; 如何想VB一样能On Lacal Error Goto x/Rusume next, 就管住所有的错误?
3) 如何探知一个设备是可写设备? 是CD-R/CD-RW/Usb Mass storage device?
现在到底可不可写?

还请大家不吝赐教,给出各种解决错误的方法,谢谢
 
有点意思!我来听课!

不过我还是想问问,你的这个是什么系统哦?说是系统工具软件,那就是说和norton工具集
之类的嘛?
 
〉 2)依然会在打开文件时,让系统弹出“I/O error 6" 或者 “File Aceess denied"
要分清这个错误是操作系统弹出的还是你的程序弹出的?
SetErrorMode只能使操作系统弹出的对话框不显示,
比如“(软驱)驱动器没有就绪”、“扇区不能读”之类
如果是你的程序弹出的错误,只能通过try..except来解决
 
请问那应当怎样区分?我已经去掉I/O check和debug info?
 
看try..except能不能捕捉了
 
;Try Finally end 不是用于异常,因为Finally部分一定执行,在一些詷用了系统资源
的地方保证调用的资源能得到释放,而不管中间是否出错。
; 调用WORD
; if 成功 then
; ; try
; ; ; 使用WORD
; ; finally
; ; ; ;释放WORD
; ; end
; else
; ; ShowMessage(调用失败);

Try except end 主要用于处理异常。一般与On..do一齐用
; ;try
; ; ;写数据
; ;except
; ; ; on EInOutError do
; ; ; ; ShowMessage(出现IO错误);
; ; ; on EWin32Error do ; ;//这句代表Win32错误
; ; ; ; ;begin
; ; ; ; ; ;调用GetLastError()处理; ; ; ; ;
; ; ; ; ;end;
; ; ; else
; ; ; ; ;对其余的错误处理
; ;end;

function integer GetDriveType(PChar)
返回
0 不确定
1 不存在
DRIVE_REMOVABLE 可移动
DRIVE_FIXED ; ;不可移动
DRIVE_REMOTE ;远程
DRIVE_COROM ;CD-ROM
DRIVE_RAMDISK ;RAV盘
 
DiskFree(byte):int64
;参数为1=A:/ ;2=B:/ 3=C:/ .....
;返回可用容量(kb),有可用容量一般都是可写的。
没有在CD-R上试过,我可没这设备。
 
我知道Try except捕捉了错误,然而,应该如何处理错误呢?
还是说出错只要被程序本体所捕捉,就不会引发系统警告?
不断的捕捉错误,或者说不断发生的错误被捕捉后,会不会影响系统稳定性?
曾经听说使用"Try"的结构会占用系统资源,是否属实?
To testnet:
;可移动设备和不可移动设备都可能是可写设备和不可写设备吧?
;CD刻录机是什么设备?DRIVE_CDROM?那怎么决定?
;DiskFree在指向空软驱时要出错
 
操作系统提示的严重错误时不能被try..except捕捉的,比如,如果没有设置SetErrorMode
那么软盘坏的话,弹出软盘坏的提示、那个错误时不能被try..except捕捉的
用try..except不会影响稳定性
用try..except只降低肉眼看不到的性能
 
那应该如何不降低性能地解决呢?
 
肉眼看不到的性能都不想降低?那就随便它要出什么错就出什么错罗
 
由于系统资源造成的异常不管他;自己造成的一定要处理,不要怕麻烦。[:D]
 
你的要求也实在高了点,关于解决方法的几点建议
方法一:
; 使用MAPI,MAPI中有几个函数可以取得设备信息,但我没CD-R,所以不能分析哪部分信息
有用,加上我对MAPI不太会用。
方法二(不是方法的方法):
; 很多信息都是保存在注册表中,如CPU在
HKEY_LOCAL_MACHINE/Hardware/Description/System/CentralProcessor/0

;别外一些设备在
scsi设备
HKEY_LOCAL_MACHINE/Enum/SCSI
IDE设备
HKEY_LOCAL_MACHINE/Enum/ESDI
Class "CDROM" ; “DiskDrive” 这可知是什么类型
CurrentDriveLetterAssignment "H" 这可知盘号

可通过字符串比较取得是否相关设备,Delphi中有相关函数,
但这个有问题,就是WIN并不会把已经作废的设备信息删除,
最后的方法,是自己用点时间,用MAPI取得设备的信息,结合注册表分析哪些是有用的,
哪些是没用的,我很多技巧都是这样学来的,如果怕麻烦又想做得完美是不太可能的。
知道结果后,别忘记告诉大家。
我想XP下应该有直接取得CD-R的API
 
问题没有被解决,重申:
我知道Try except捕捉了错误,然而,应该如何处理错误呢?
还是说出错只要被程序本体所捕捉,就不会引发系统警告?
// 不断的捕捉错误,或者说不断发生的错误被捕捉后,会不会影响系统稳定性?[known]
曾经听说使用"Try"的结构会占用系统资源,是否属实?
 
??????
怎样处理??你想怎样处理就怎样处理啦
你不能在IDE下测试程序,因为IDE会优先捕捉,要编译后单独运行才能看到结果。
是不是这个意思。首先你想出错后怎样处理,你是作者,你掌握一切。
 
比如说:建立一个文件“a.dat",不能写的话就以result:=False,应该怎么写
Function CreateFile(Filename:String):Boolean;
;Begin
;
;End;
 
介质不可写是什么错误?写保护?网络路径不存在?用户无权限?介质有坏道?怎么区分
介质不再可写:突然拔除/网络短线/介质已满?怎么安全的处理这些事情呢?可否举个
完整的例子。我还是不大明白:只要捕捉就可以了吗?那打不开文件也可以写吧?
捕捉回来再弹回去好了?
绝对不让系统弹出对话框
 
你说得不很清楚,对于文件已存在的情况下,建立的文件“a.dat"是覆盖上去,
还是怎样,这个条件对于写代码很重要。
如果只是简单地测试一下是否有可写空间给你写,哪就可以试试 DiskFree()
或下面这个简单的代码,
function ;IsCanCreateFile(Filename:String):Boolean;
var
; hf:TFileStream;
; s:string;
begin
; Result:=true;
; s:=ExtractFilePath(FileName)+'0000000.dat';
; Try
; ; hf:=TFileStream.Create(s,fmCreate);
; except
; ; Result:=false;
; end;
; if Result then ;hf.Free;
; DeleteFile(s);
end;
在IDE下调试请不要选
Tools/Debugger Optional/Language Exception/Stop On Delphi Exception
 
那么意思是说,Except 之中不用SetLastError(0)?
 
后退
顶部