delphi 下 用assert 来完成错误的捕捉

delphi 下 用assert 来完成错误的捕捉
delphi 下 用assert 来完成错误的捕捉

delphi 下用assert 来完成错误的捕捉

delphi 下用assert 来完成错误的捕捉

Assert 过程原形procedure Assert (expr :Boolean [; const msg: string]);在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 addressend;

{$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);

Delphi中错误信息对照表

Delphi中错误信息对照表 '''' not previously declared as a PROPERTY前面没有说明PROPERTY ''GOTO '' leads into or out of TRY statement GOTO 进入或超出TRY语句的范围 clause expected, but found要求子句,但出现 16-Bit fixup encountered in object file ''''在对象文件遇到16位修复486/487 instructions not enabled不能用486/487指令 Abstract methods must be virtual or dynamic抽象方法必须为虚拟的或动态的 Array type required需要数组类型Assignment to FOR-Loop variable ''''给FOR循环变量赋值Bad argument type in variable type array constructor在变量类型数组结构中不正确的参数类型 Bad file format ''''错误的文件格式 Bad file format: 错误的文件格式 Bad global symbol definition: '''' in object file ''''对象文件''''中错误的全局符号定义'''' Bad unit format: 错误的单元格式 BREAK or CONTINUE outside of loop BREAK或CONTINUE超出循环 Cannot add or subtract relocatable symbols不能增加或减少可重置的符号 Cannot assign to a read-only property不能指定只读属性Cannot BREAK, CONTINUE or EXIT out of a FINALLY clause超出FINALLY 子句的范围,不能使用BREAK,CONTINUE或EXIT语句 Cannot initialize local variables不能初始化局部变量Cannot initialize multiple variables不能初始化多个变量Cannot initialize thread local variables不能初始化线程局部变量 Cannot override a static method不能覆盖静态方法Cannot read a write-only property不能读取只写属性Case label outside of range of case expression CASE标号超出了CASE表达式的范围 Circular unit reference to 对单元循环引用 Class already has a default property类已具有默认的属性Class does not have a default property类没有默认的属性Class or object types only allowed in type section在类型区段只允许有类或对象类型 Class type required需要类类型 Close error on 文件关闭错误 Compile terminated by user用户中止编译Constant expected要求常量

C语言断言assert的用法

assert的用法 assert(); 当expression结果为“假”时,会在stderr中输出这条语句所在的文件名和行号,以及这条表达式。这只在调试版本中起作用,在Release版本中不会产生任何代码。 通常当我们使用assert时,都在强烈说明一个含义:在这里必然如此。它通常用于一个函数的先验条件和后验条件的检查。比如我写一个C风格复制字符串的函数,并且认为调用者不应该传入NULL指针: char * clone_string(const char * source) { char * result; assert(source != NULL); result = (char *)malloc(strlen(source) + 1); if (result != NULL) { strcpy(result, source); assert(strcmp(result, source) == 0); } return result; } 注意到我对source是否为NULL是用assert检查的,但对result是不是为NULL是用if语句判断的,这是因为在调用代码正确的情况下source必然不为NULL,如果断言失败,说明调用代码中有错误,需要修改;但result作为malloc的返回值则不一定,在malloc代码无误的情况下仍然可能返回NULL——当内存块不足时。最后又用assert对strcpy的结果进行检查,因为只要代码正确,无论什么情况strcpy应该正常完成复制,它没有malloc那种异常情况存在。 在《编程精粹》第二章(自己设计并使用断言)开始的一段话把assert的用途说的很清楚: 利用编译程序自动查错固然好,但我敢说只要你观察一下项目中那些比较明显的错误,就会发现编译程序所查出的只是其中的一小部分。我还敢说,如果排除掉了程序中的所有错误那么在大部分时间内程序都会正确工作。 还记得第1章中的下面代码吗? strCopy = memcpy(malloc(length), str, length); 该语句在多数情况下都会工作得很好,除非malloc的调用产生失败。当malloc失败时,就会给memcpy返回一个NULL指针。由于memcpy处理不了NULL指针,所以出现了错误。如果你很走运,在交付之前这个错误导致程序的瘫痪,从而暴露出来。但是如果你不走运,没有及时地发现这个错误,那某位顾客就一定会“走运”了。

C++Assert

assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义如下: #include void assert( int expression ); assert的作用是现计算表达式expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用abort 来终止程序运行。 请看下面的程序清单badptr.c: #include #include #include int main( void ) { FILE *fp; fp = fopen( "test.txt", "w" ); //以可写的方式打开一个文件,如果不存在就创建一个同名文件 assert( fp ); //所以这里不会出错 fclose( fp ); fp = fopen( "noexitfile.txt", "r" ); //以只读的方式打开一个文件,如果不存在就打开文件失败 assert( fp ); //所以这里可能会出错 fclose( fp ); //如果出错,程序永远都执行不到这里来 return 0; } 在命令行下运行该程序,结果如下: [root@localhost error_process]# gcc badptr.c [root@localhost error_process]# ./a.out a.out: badptr.c:14: main: Assertion `fp'' failed. 已放弃 使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。 在调试结束后,可以通过在包含#include 的语句之前插入#define NDEBUG 来禁用assert调用,示例代码如下: #include #define NDEBUG #include assert的用法总结与注意事项: 1、在函数开始处检验传入参数的合法性,如: int resetBufferSize(int nNewSize) { //函数功能:改变缓冲区大小,//函数参数:nNewSize 缓冲区新长度//函数返回值:缓冲区当前长度//说明:保持原信息内容不变//nNewSize<=0表示清除缓冲区 assert(nNewSize >= 0); assert(nNewSize <= MAX_BUFFER_SIZE); } 2、每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观地判断是哪个条件失败,比较下面两种形式的代码: 不好:assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize); 好:assert(nOffset >= 0);

Delphi编译错误信息

***************************编译错误信息************************ ';' not allowed before 'ELSE' ElSE前不允许有“;” '' clause not allowed in OLE automation section 在OLE自动区段不允许“”子句 '' is not a type identifier 不是类型标识符 '' not previously declared as a PROPERTY 前面没有说明PROPERTY 'GOTO ' leads into or out of TRY statement GOTO 进入或超出TRY语句的范围 clause expected, but found 要求子句,但出现 16-Bit fixup encountered in object file '' 在对象文件遇到16位修复 486/487 instructions not enabled 不能用486/487指令 Abstract methods must be virtual or dynamic 抽象方法必须为虚拟的或动态的 Array type required 需要数组类型 Assignment to FOR-Loop variable '' 给FOR循环变量赋值 Bad argument type in variable type array constructor 在变量类型数组结构中不正确的参数类型 Bad file format '' 错误的文件格式 Bad file format: 错误的文件格式 Bad global symbol definition: '' in object file '' 对象文件''中错误的全局符号定义'' Bad unit format: 错误的单元格式 BREAK or CONTINUE outside of loop BREAK或CONTINUE超出循环 Cannot add or subtract relocatable symbols 不能增加或减少可重置的符号 Cannot assign to a read-only property 不能指定只读属性 Cannot BREAK, CONTINUE or EXIT out of a FINALLY clause 超出FINALLY子句的范围,不能使用BREAK,CONTINUE或EXIT语句 Cannot initialize local variables 不能初始化局部变量 Cannot initialize multiple variables 不能初始化多个变量 Cannot initialize thread local variables 不能初始化线程局部变量 Cannot override a static method 不能覆盖静态方法 Cannot read a write-only property 不能读取只写属性 Case label outside of range of case expression CASE标号超出了CASE表达式的范围 Circular unit reference to 对单元循环引用

断言(ASSERT)的用法

我一直以为assert仅仅是个报错函数,事实上,它居然是个宏,并且作用并非“报错”。 在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert()的用法像是一种“契约式编程”,在我的理解中,其表达的意思就是,程序在我的假设条件下,能够正常良好的运作,其实就相当于一个if语句: if(假设成立) { 程序正常运行; } else { 报错&&终止程序!(避免由程序运行引起更大的错误) } 但是这样写的话,就会有无数个if语句,甚至会出现,一个if语句的括号从文件头到文件尾,并且大多数情况下,我们要进行验证的假设,只是属于偶然性事件,又或者我们仅仅想测试一下,一些最坏情况是否发生,所以这里有了assert(). assert宏的原型定义在assert.h中,其作用是如果它的条件返回错误,则终止程序执行. 1 #include "assert.h" 2void assert(int expression ); assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。 使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。 在调试结束后,可以通过在包含#include 的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:

1 #include 2#define NDEBUG 3 #include 用法总结与注意事项: 1)在函数开始处检验传入参数的合法性 如: 1int resetBufferSize(int nNewSize) 2 { 3//功能:改变缓冲区大小, 4//参数:nNewSize缓冲区新长度 5//返回值:缓冲区当前长度 6//说明:保持原信息内容不变nNewSize<=0表示清除缓冲区 7 assert(nNewSize>= 0); 8 assert(nNewSize<= MAX_BUFFER_SIZE); 9 10 ... 11 } 2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败 不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize); 好: assert(nOffset >= 0); assert(nOffset+nSize <= m_nInfomationSize); 3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题 错误: assert(i++ < 100)

Delphi中错误信息对照表.

Delphi中错误信息对照表 ""not previously declared as a PROPERTY 前面没有说明PROPERTY ''GOTO "leads into or out of TRY statement GOTO进入或超出TRY语句的范围 clause expected, but found 要求子句,但岀现 16-Bit fixup encountered in object file "" 在对象文件遇到16位修复486/487 instructions not enabled 不能用486/487 指 令 Abstract methods must be virtual or dynamic 抽象方法必须为虚 拟的或动态的 Array type required 需要数组类型Assignment to FOR-Loop variable "" 给FOR循环变量赋值 Bad argument type in variable type array constructor 在变量类型数组结 构中不正确的参数类型 Bad file format '''' 错误的文件格式 Bad file format: 错误的文件格式 Bad global symbol definition: "" in object file "" 对象文件"”中错误的全局符号定义”" Bad unit format: 错误的单元格式 BREAK or CONTINUE outside of loop BREAK 或CONTINUE超出循环 Cannot add or subtract relocatable symbols 不能增加或减少可 重置的符号 Cannot assign to a read-only property 不能指定只读属性Cannot BREAK, CONTINUE or EXIT out of a FINALLY clause 超出FINALLY 子句的范围,不能使用BREAK,CONTINUE 或EXIT语句 Cannot initialize local variables 不能初始化局部变量Cannot initialize multiple variables 不能初始化多个变量Cannot initialize thread local variables 不能初始化线程局部变 量 Cannot override a static method 不能覆盖静态方法Cannot read a write-only property 不能读取只写属性Case label outside of range of case expression CASE标号超出了 CASE表达式的范围 对单元循环引用 Circular unit reference to Class already has a default property 类已具有默认的属性Class does not have a default property 类没有默认的属性Class or object types only allowed in type section 在类型区段只允许有 类或对象类型 Class type required 需要类类型 Close error on 文件关闭错误 Compile terminated by user 用户中止编译Constant expected 要求常量

C++ Assert()断言机制原理以及使用

MSDN原文如是说: Evaluates an expression and, when the result is false, prints a diagnostic message and aborts the program. (判断一个表达式,如果结果为假,输出诊断消息并中止程序。)[cpp]view plaincopy print? 1.void assert( 2.int expression 3.); 参数:Expression (including pointers) that evaluates to nonzero or 0.(表达式【包括指针】是非零或零) 原理:assert的作用是现计算表达式expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用abort 来终止程序运行。 MSDN示例程序; [cpp]view plaincopy print? 1.// crt_assert.c 2.// compile with: /c 3.#include 4.#include 5.#include 6. 7.void analyze_string( char *string ); // Prototype 8. 9.int main( void ) 10.{

11.char test1[] = "abc", *test2 = NULL, test3[] = ""; 12. 13. printf ( "Analyzing string '%s'\n", test1 ); fflush( stdout ); 14. analyze_string( test1 ); 15. printf ( "Analyzing string '%s'\n", test2 ); fflush( stdout ); 16. analyze_string( test2 ); 17. printf ( "Analyzing string '%s'\n", test3 ); fflush( stdout ); 18. analyze_string( test3 ); 19.} 20. 21.// Tests a string to see if it is NULL, 22.// empty, or longer than 0 characters. 23.void analyze_string( char * string ) 24.{ 25. assert( string != NULL ); // Cannot be NULL 26. assert( *string != '\0' ); // Cannot be empty 27. assert( strlen( string ) > 2 ); // Length must exceed 2 28.} 输出结果 [cpp]view plaincopy print? 1.Analyzing string 'abc' 2.Analyzing string '(null)' 3.Assertion failed: string != NULL, file assert.cpp, line 25 4. 5.abnormal program termination 用法总结: 1)在函数开始处检验传入参数的合法性 如:

Delphi常见错误代码

Delphi常见错误代码及中文解释 ';' not allowed before 'ELSE' ElSE前不允许有“;” '' clause not allowed in OLE automation section 在OLE自动区段不允许“”子句 '' is not a type identifier 不是类型标识符 '' not previously declared as a PROPERTY 前面没有说明PROPERTY 'GOTO

delphi 下 用assert 来完成错误的捕捉

delphi 下用assert 来完成错误的捕捉 delphi 下用assert 来完成错误的捕捉 Assert 过程原形procedure Assert (expr :Boolean [; const msg: string]);在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 addressend; {$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处理过程,

DELPHI定义的条件编译的全部说明

DELPHI定义的条件编译的全部说明 经常看到一些程序里面用到如: {$ifdef win16},{$ifdef win32}之类的信息, 可是这些好像并没有定义,不知道在哪里可以找到这些条件编译的定义或者是说明具体讲述win16代表什么,WIN32代表什么,VER140。。。。代表什么的? {$IFDEF WIN32} -- 这可不是批注喔! 对于Delphi来说﹐左右大括号之间的内容是批注﹐然而「{$」 (左括号后紧接着货币符号)对于Compiler(编译器)而言并不是批注﹐ 而是写给Compiler看的特别指示。 应用时机与场合 Delphi中有许许多多的Compiler Directives(编译器指令)﹐ 这些编译指令对于我们的程序发展有何影响呢? 它们又能帮我们什么忙呢? Compiler Directive 对程序开发的影响与助益, 可以从以下几个方向来讨论: ?协助除错 ? 版本分类 ?程序的重用与管理 ? 设定统一的执行环境 协助除错 稳健熟练的程序设计师经常会在开发应用系统的过程中﹐特别加入一些除错程序或者回馈验算的程序﹐这些除错程序对于软件品质的提升有极其正面的功能。然而开发完成的正式版本中如果不需要这些额外的程序的话﹐要想在一堆程序中找出哪些是除错用的程序并加以删除或设定为批注﹐不仅累人﹐而且容易出错﹐况且日后维护时这些除错程序还用得着。此时如果能够应用像是$IFDEF的Compiler Directives ﹐就可以轻易的指示Delphi要/不要将某一段程序编进执行文件中。同时﹐Compiler本身也提供了一些错误检查的开关﹐可以预先对程序中可能的问题提醒程序设计师注意﹐同样有助于撰写正确的程序。 版本分类 除了上述的除错版本/正式版本的分类之外﹐对于像是「试用版」「普及版」「专业版」的版本分类﹐也可以经由Compiler Directive的使用﹐为最后的产品设定不同的使用权限。其它诸如「中文版」「日文版」「国际标准版」等全球版本管理方面﹐同样也可以视需要指示Delphi 特别连结哪些资源档或者是采用哪些适当的程序。以上的两则例子中﹐各版本间只需共享同一份程序代码即可。 Delphi 1.0 与Delphi 2.0有许多不同之处﹐组件资源文件(.DCR)即是其中一例﹐两者的档案格式并不兼容﹐在您读过本文之后﹐相信可以写出这样的程序﹐指示Delphi在不同的版本采用适当的资源文件以利于组件的安装。 {$IFDEF WIN32} {$R XXX32.DCR} {$ELSE} {$R XXXX16.DCR}

C语言中assert的用法

C语言中assert的用法 C语言中assert的用法 导语:assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行。下面就由小编为大家介绍一下C语言中assert的用法,希望对大家有所帮助! #include void assert( int expression ); assert的作用是现计算表达式expression ,如果其值为假(即为0),那么它先向stderr 打印一条出错信息, 然后通过调用abort 来终止程序运行。 请看下面的.程序清单badptr.c: 代码如下: #include #include #include int main( void ) { FILE *fp; fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件 assert( fp ); //所以这里不会出错 fclose( fp ); fp = fopen( "noexitfile.txt", "r" );//以只读的方式打开一个文件,如果不存在就打开文件失败 assert( fp ); //所以这里出错 fclose( fp ); //程序永远都执行不到这里来 return 0; } 宏名: assert 功能: 测试一个条件并可能使程序终止 用法: void assert(int test); 程序例: 代码如下: #include #include #include struct ITEM { int key; int value; }; /* add item to list, make sure list is not null */ void additem(struct ITEM *itemptr) { assert(itemptr != NULL); /* add item to list */ }

Delphi代码编写标准详解

Delphi编写标准指南 一、序言 二、通用源代码格式规则 2.1 缩格 2.2 页边空格 2.3 Begin...End 配对 三、Object Pascal 3.1 括号 3.2 保留字和关键字 3.3 过程和函数(例程) 3.3.1 命名/格式化 3.3.2 形式参数 3.3.2.1 格式化 3.3.2.2 命名 3.3.2.3 参数的排序 3.3.2.4 常量参数 3.3.2.5 名称的冲突 3.4 变量 3.4.1 变量的命名和格式 3.4.2 局部变量 3.4.3 全局变量的使用 3.5 类型 3.5.1 大写约定 3.5.1.1 浮点指针类型 3.5.1.2 枚举类型 3.5.1.3 变数和ole变数类型 3.5.2 结构类型 3.5.2.1 数组类型 3.5.2.2 记录类型 3.6 语句 3.6.1 if 语句 3.6.2 case 语句 3.6.2.1 一般性话题 3.6.2.2 格式 3.6.3 while 语句 3.6.4 for 语句 3.6.5 repeat 语句 3.6.6 with 语句 3.6.6.1 一般话题 3.6.6.2 格式 3.7 结构异常处理 3.7.1 一般话题 3.7.2 try...finally的使用 3.7.3 try...except的使用

3.7.4 try...except...else的使用 3.8 类类型 3.8.1 命名和格式 3.8.2 域 3.8.2.1 命名/格式 3.8.2.2 可视化 3.8.3 方法 3.8.3.1 命名/格式 3.8.3.2 使用静态的方法 3.8.3.3 使用虚拟/动态的方法 3.8.3.4 使用抽象的方法 3.8.3.5 属性存取方法 3.8.4 属性 3.8. 4.1 命名/格式 3.8. 4.2 使用存取的方法 四、文件 4.1 工程文件 4.1.1 命名 4.2 窗体文件 4.2.1 命名 4.3 数据模板文件 4.3.1 命名 4.4 远端数据模板文件 4.4.1 命名 4.5 Unit文件 4.5.1 通用Unit结构 4.5.1.1 unit的名字 4.5.1.2 uses子句 4.5.1.3 interface部分 4.5.1.4 implementation部分 4.5.1.5 initialization部分 4.5.1.6 finalization部分 4.5.2 窗体单元 4.5.2.1 命名 4.5.3 数据模板单元 4.5.3.1 命名 4.5.4 一般目的单元 4.5.4.1 命名 4.5.5 构件单元 4.5.5.1 命名 4.6 文件头 五、窗体和数据模板 5.1 窗体 5.1.1 窗体类型命名标准

insist, persevere, persist, adhere, cling, assert, stay, maintain, hang, hold, stick, keep

张耘《英语易混词辨析》 insist, persevere, persist, adhere, cling, assert, stay, maintain, hang, hold, stick, keep ●都可表示“坚持”之意。 ◆insist可表示“坚持主张”自己的看法、意见等,不顾反对,或“坚决要求”别人做某事,立场坚定,可作及物动词和不及物动词。 ◇insist作及物动词时不能用名词、代词或动词不定式作宾语,只能用that从句作宾语;从句用陈述语气(引导词that可省略)表示已发生的事或已存在的状态,意为“坚持认为,坚持说”;从句用虚拟语气(谓语用should +动词原形或直接用动词原形,引导词that一般不省略)表示尚未发生的动作,意为“坚持要,一定要”。 I insisted (that) he was wrong. 我坚持认为他错了。 He insists that he had done right. 他坚持认为自己做对了。 He insisted that she was careful. 他坚持认为她是小心的。 He insisted that she (should) be careful. 他坚持她应该小心。 We all insisted that we (should) not rest until we fulfilled the task. 我们都坚持要完成了任务再休息。 ◇insist作不及物动词时与介词on[upon]连用,再后接名词、代词或动名词,动名词作介词on[upon]的宾语时,可加名词或代词的所有格(正式)或宾格(非正式)表示其逻辑主体,该动名词的否定式是把not加在动名词前。 I’ll go with you if you insist. 如果你坚持,我就跟你去。 We insist on[upon] self-reliance. 我们坚持自力更生。 He insists on seeing me home. 他坚持要送我回家。 He insists on my[me] being there. 他坚持要我到场。 He insists on my going there with him. 他坚持要我同他一起去那里。 He insists that I (should) go there with him. He insists on not seeing you until next week. 他坚持要下星期才见你。 ◇在美语文章中常见insist on[upon] it that-clause结构,它与insist that-clause或insist on[upon]结构相同。 She insists upon it that he go. She insists that he (should) go. 她一定要他去。 She insists upon his going. He insists on it that he is innocent. He insists that he is innocent. 他坚持他是无罪的。 He insists on his innocence. ◆persevere意为“坚持不懈,锲而不舍,不屈不挠”,为不及物动词,后接介词in[with, at]短语,表示不怕困难或反对而坚持或持续某种具体的好的行为,只用于褒义。 He encouraged me to persevere in my studies. 他鼓励我要锲而不舍地学习。 He persevered with his work. 他孜孜不倦地工作。 ◆persist多作不及物动词,可表示在行动上不顾困难、反对或警告仍然“坚持”做原来所做的事,但所坚持的事不一定都是好的或正确的,可用于褒义,但更常用于贬义,着重不听劝告、固执己见、一意孤行;后接in (doing) sth.表示“坚持(继续)做某事”;后接with sth.表示“不畏困难继续做某事”,常用于褒义,含锲而不舍之意。 He persists in his opinion. 他固执己见。 He persisted in doing things in his own way. 他坚持按自己的办法做事。 He persisted in reading the newspaper at the dinner table. 他执意一边吃晚饭一边看报纸。 They persisted with the agricultural reforms, despite opposition from the farmers. 尽管农民反对,他们坚持农业改革。 ◇persist可作及物动词,后接that从句作宾语,可意为“坚持说”;表示“坚持是怎么回事”时,从句谓语用陈述语气;表示“坚持该怎么做”时,从句谓语用虚拟语气。

Delphi异常处理tryexcept语句和tryfin(精)

一、异常的来源在Delphi的应用程序中,下列的情况都比较有可能产生异常。(1)文件处理(2)内存分配(3)Windows 资源(4)运行时创建对象和窗体(5)硬件和操作系统冲突 二、异常的处理(1)try…except…end;在try体内的代码发生异常时,系统将转向except部分进行异常的处理。这是Delphi处理异常的最基本的方式之一。(2)try…finally…end;这种异常处理结构一般用于保护Windows的资源分配等方面,它确保了无论try体内的代码是否发生异常,都需要由系统进行最后的统一处理的一些Windows对象的正确处理。和try…except…end不同,该结构的finally部分总被执行。(3)不存在try…except…finally…end结构来既处理异常,又保护资源分配的结构,但是,try…except…end结构允许嵌套到try…finally…end结构中,从而实现既处理异常,又保护资源的分配。三、异常的精确处理(1)定义一个异常。 在Delphi中,每个异常都是Exception[1]类的一个派生类[2]。因此,定义一个异常就是定义一个Exception类的派生类。type EMyException = class(Exception;当然,基类可以是Exception或者Exception的任何一个任何层次的派生类。(2)在程序中抛出一个异常。根据不同的情况抛出异常是使用异常的最基本的模式。在Delphi中,由raise语句来实现。【语法】raise 异常类.Create(…异常的缺省说明?; (3)在try…except…end 中更加精确的捕捉异常。使用on E:异常类do…结构可以在do体内处理特定异常类所抛出的异常。四、异常的调试在Delphi IDE中,解除“Debugger Options”(可以使用菜单Tools—>Debugger Options…进行访问)中的Integrated Debugging复选框的勾选状态可以进行异常的调试。五、异常的补充说明(1)每一段程序都有可能产生错误!这是软件业的一个不容置疑的现象和规律。事实上,传统的if…else…结构完全可以解决所有的错误,使用Exception机制也没能够回避在最原始的层次,通过遍历可能的情况来产生异常的做法,那么,为什么还要异常机制?答案很清楚:异常提供了一种更加灵活和开放的方式,使得后来的编程者可以来根据实际的情况处理这种错误,而不是使用预先设定好的处理结果。 Delphi7异常处理了解什么是异常和Delphi7中提

断言的用法

断言(ASSERT)的用法 我一直以为assert仅仅是个报错函数,事实上,它居然是个宏,并且作用并非“报错”。 在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert()的用法像是一种“契约式编程”,在我的理解中,其表达的意思就是,程序在我的假设条件下,能够正常良好的运作,其实就相当于一个if语句: if(假设成立) { 程序正常运行; } else { 报错&&终止程序!(避免由程序运行引起更大的错误) } 但是这样写的话,就会有无数个if语句,甚至会出现,一个if语句的括号从文件头到文件尾,并且大多数情况下,我们要进行验证的假设,只是属于偶然性事件,又或者我们仅仅想测试一下,一些最坏情况是否发生,所以这里有了assert(). assert宏的原型定义在assert.h中,其作用是如果它的条件返回错误,则终止程序执行.

1 #include "assert.h" 2 void assert( int expression ); assert的作用是现计算表达式expression ,如果其值为假(即为0),那么它先向stderr 打印一条出错信息,然后通过调用abort 来终止程序运行。 使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。 在调试结束后,可以通过在包含#include 的语句之前插入#define NDEBUG 来禁用assert调用,示例代码如下: 1 #include 2 #define NDEBUG 3 #include 用法总结与注意事项: 1)在函数开始处检验传入参数的合法性 如: 1 int resetBufferSize(int nNewSize) 2 { 3 //功能:改变缓冲区大小, 4 //参数:nNewSize 缓冲区新长度 5 //返回值:缓冲区当前长度

相关主题
相关文档
最新文档