一团糊涂

笔记本

首页 CNDEV 网志 联络 (RSS 2.0) (Atom) 登录
  随笔 18 :: 收藏 0 :: 评论 0 :: 寻迹: 0

News

开张了

今日天气


QQ:5311133
mail:bigshrimp@playicq.com

随笔

随笔归档

图库

delphi相关

友情链接

2004-11-20 #

delphi2005

安装完从borland下的trial版本后,利用keygen

来完成注册.
发表于 @ 23:27 | 评论与反馈 (0)

异常类型:

1.前台导向类

程序可通过try except块来捕捉,根据异常handle来判断程序处理.通过生成错误导向页面来引导用户处理.

2.后台异常类

后台程序出现可预知的错误,通过try except块来捕捉,根据异常handle来判断程序处理,运行时log到指定文件.

3.后台无法预料的错误

用madshiExcept捕捉后让用户选择处理方式.

发表于 @ 16:49 | 评论与反馈 (0)

Assert  过程原形
[code]procedure Assert (expr :Boolean [; const msg: string]);[/code]
在system.pas 里 Assert 的实现是:

procedure _Assert(const Message, Filename: AnsiString; LineNumber: Integer);
{$IFDEF PUREPASCAL}
begin
  if Assigned(AssertErrorProc) then
    AssertErrorProc(Message, Filename, LineNumber, Pointer(-1))
  else
    Error(reAssertionFailed);  // loses return address
end;
{$ELSE}
asm
        PUSH    EBX
{$IFDEF PIC}
        PUSH    EAX
        PUSH    ECX
        CALL    GetGOT
        MOV     EBX, EAX
        MOV     EAX, [EBX].AssertErrorProc
        CMP     [EAX], 0
        POP     ECX
        POP     EAX
{$ELSE}
        CMP     AssertErrorProc,0
{$ENDIF}
        JNZ     @@1
        MOV     AL,reAssertionFailed
        CALL    Error
        JMP     @@exit
@@1:    PUSH    [ESP+4].Pointer
{$IFDEF PIC}
        MOV     EBX, [EBX].AssertErrorProc
        CALL    [EBX]
{$ELSE}
        CALL    AssertErrorProc
{$ENDIF}
@@exit:
        POP     EBX
end;
{$ENDIF}


可以看出AssertErrorProc() 是没有初值的,通过对其赋值可以定义自己的Assert处理过程,另如果未对AssertErrorProc赋值,将调用Error()处理过程来做为异常处理.

TAssertErrorProc = procedure (const Message, Filename: string;
    LineNumber: Integer; ErrorAddr: Pointer);

{$ASSERTIONS OFF/ON} 开关来决定Assert是否被调用.可以在project-option-complier里设置.

这样就可以在beta或debug版本是打开,而最终发布时关闭调试输出了.

一个简单的AssertErrorProc 例程:

unit AssertLogs;

interface

implementation
uses
  Windows,
  SysUtils;

var
  runErrMsg : String;
  oldAssertErrorProc : TAssertErrorProc;

procedure LogAssert(const Message, Filename: string; LineNumber: Integer; ErrorAddr: Pointer);
begin
  runErrMsg := format('Error: %s, Addr: %p, in file(%d): %s ',
                      [Message, ErrorAddr, LineNumber, FileName]);
  if IsConsole then
    Writeln(runErrMsg)
  else
    MessageBox(0, pChar(runErrMsg), 'Error Log by AssertLogs', 0);
end;

initialization
  oldAssertErrorProc := AssertErrorProc;
  AssertErrorProc := @LogAssert;

finalization
  AssertErrorProc := oldAssertErrorProc;
end.

*************************************
那么在output debug信息时只需要:

Assert(false,outputstring);

发表于 @ 16:18 | 评论与反馈 (1)

http://www.borland.com/products/downloads/download_delphi.html#
发表于 @ 14:47 | 评论与反馈 (4)