200分,请各位高手谈一谈如何设计软件中的错误日志文件,思路等,有什么好的建议说出来大家参考一下,参与者有分!!(200分)

  • 主题发起人 主题发起人 DragonInCity
  • 开始时间 开始时间
D

DragonInCity

Unregistered / Unconfirmed
GUEST, unregistred user!
参与者有分!!希望大家顶呀
 
首先我觉得日志不能是普通文本形式,原因有以下几点
1. 不方便检阅
2. 随便任何一个人都能进行更改
其实我觉得日志更应该像数据库,这样每个调用日志记录API人员都能把日志写到一个共同的地方,方便管理. 这也是对第一点不能是普通文本形式的补充及修补
再者,日志应该分类多样化,等级多样化,记录形式多样化.
 
我认为有必要将一部分日志添加到文件文件(或者INI文件)中,扩展名改成 .log 或者 .Dat.
因为假如数据库出现灾难性故障,就写不进去日志,甚至看不到出错的原因了
综合:将用户数据相关操作日志写到数据库,将系统日志写到文本文件。
 
怎么写,如何捕获错误,请各位大虾给一点提示,谢谢了!!!
 
try
dosomething;
except
on e: exception do
begin
memo1.Lines.Add( '错误:' + e.Message );
end;
类似这样,只不过,将日志写入数据库或者文本文件中就行了。
 
To happycyp
你不觉得这样做太麻烦了吗,其实程序的错误日志可以通过Application的OnException事件获得,但现在我不知道如何取得发生错误的窗体和触发这个事件的控件,所以想请各位高手指教一下。
 
以前我用过这种控件,它可以让控制状态,一种是在调试时,一个是在运行期,只需要设定一个参数就可以了,名字就不记得了,你到Google里去找一下,很多的
 
不想用控件,我说说我的想法:我想通过ApplicationEvent控件的OnException事件来获取程序中出现的错误,然后将它们放到数据库中,这样我就不用每一个动作中都放一个try...except来获取错误信息了(麻烦),现在问题的关键是我如何能够在OnException事件中获取产生错误的单元名称和控件名称?(当然,控件可以是button、菜单、TAction等)
 
这种想好不错,顶上。
 
可以在OnException事件中获取产生错误的单元名称和控件名称?
如果可以就太好了。
 
日志文件用文本就可以了,日志不就是为了方便查看嘛!
不写日志就不用try...exception...end了吗?不可想象!
 
写错误日志不能等到错误发生,否则,一旦错误发生,程序异常退出或假死,根本不会执行后面的代码,所以,首先多使用try语句,我的思路是,首先作者要想到可能出现的错误,程序记录的错误都是些代码,一般人看不懂,在可能出现错误的处理模块中,单步执行,然后根据作者事先定义的错误信息,根据具体情况显示
 
procedure ExceptionHandler(Sender: TObject; EInstance: Exception);
var
msgError: string;
begin
if EInstance is EDivByZero then
msgError := '除数不能为零!'
else if EInstance is EAccessViolation then
msgError := '访问了无效的内存区域!'
else if (EInstance is EDatabaseError) then
msgError := '数据库操作出现错误!'
else if (EInstance is EFOpenError) then
msgError := '文件不能打开!'
else if (EInstance is EConvertError) then
msgError := '非法的类型转换!'
else if (Pos('General network error', EInstance.Message) > 0)
or (Pos('Connection failure', EInstance.Message) > 0)
or (Pos('SQL Server does not exist or access denied', EInstance.Message) > 0) then
begin
try
FCon.Connected := False;
FCon.Connected := True;
except
FCon.Connected := False;
msgError := '对不起连接(网络)失败,请稍后再试!';
end;
end
else
msgError := '未知错误';
//系统提示内容
MsgError := #13 + '系统提示:' + (Sender as TComponent).Name + ' ' + EInstance.ClassName + '' + EInstance.Message;

WriteLog('错误:' + DateTimetoStr(Now) + ' ' + UserName
+ #13 + msgError);
GetErrorPicture(msgError);
if (EInstance is EDatabaseError) then
begin
with FCon.Errors do
begin
WriteLog(#13 + 'Number:' + InttoStr(Item[0].Number)
+ 'Source:' + Item[0].Source
+ 'Description:' + Item[0].Description
+ 'HelpFile:' + Item[0].HelpFile
+ #13
+ 'HelpContext:' + InttoStr(Item[0].HelpContext)
+ 'SQLState:' + Item[0].SQLState
+ 'NativeError:' + InttoStr(Item[0].NativeError));
end;
end;
end;

//-------------------------------------------------------------------------
application.OnException := ExceptionHandler;
 
我觉得用TRY...EXCEPT...END比较好,虽然繁杂。但灵活。
要不就要写一些功用错误处理函数。
 
去下载一个叫ExceptionLog的东西,它能生成日志,只需要在工程中引用它就行,它有个flash示例,很强大,适合软件的测试版发布
 
My View:
1、日志模块适于用小型数据系统来保存
2、日志模块分为Catch端和Manage端,即捕获子模块、管理子模块,前者专用于日志生成,后者专于日志查询、删除等,前者是Writer后者是Reader+Manager,统一在一起也行
3、日志级别可粗分为,
A.设计、逻辑、算法日志,这类信息是程序员要看的,其错误产生的根源是程序员设计的程序有问题,在日志中就会有所反馈
B.如果系统是基于命令模式设计的,那么要支持Undo功能,那么就可以从日志中反序调出命令,并以反方向算法执行,当然这个必须先设计一种命令语法
C、在系统运行中由于一次处理的数据很多,用即时报错将会报出非常多的错误,适于用日志来保存,并一次生显示所有错误,就像Delphi编译时的语法检测,把所有的语法错误显示在一个Dubug Message Box中。这个肯定都不陌生
4、一般的即时性错误没有必要记录,像ABC不是一个有效的整数之类的错误

--月夜风筝
 
icc精辟,顶
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
471
import
I
后退
顶部