Delphi异常处理tryexcept语句和tryfin(精)
Delphi 中的程序调试及异常处理
编译期错误
编译期错误也称为语法错误。在DelPhi中,通常是当程序代码违 反了object Pascal语言的语法规则时发生这类错误。比较常见的语法错 误有标识符未定义或拼写错误;语句的末尾漏掉分号;赋值语句中漏 写昌号;begin与end末配对;括号末配对;引号末配对等。
如果程序代码中有语法错误,编译不能通过,代码编辑器的状态 行将给出错误信息提示,并加亮有语法错误的代码行。
Try…except语句 Raise语句 Try…finally语句 自定义异常类及其使用
Delphi对异常的自动处理
Delphi为应用程序提供了一套缺省的自动异常处理机制,即当前 模块发生错误后退出当前模块并给出错误信息,而并不立即引起应用 程序的中止。 若程序在Delphi的集成开发环境中运行,在给出相应错 误信息的同时,还尽可能定位出错的位置。
I
Overflow checking 检查整数操作是否溢出
Q
信息(Messages)
选项 Show hints
说明 使编译器显示提示信息
Show Warnings
使编译器显示警告信息
编译选项3
语法选项(Syntax options)
选项 Strick var-strings
Complete Boolean eval
举例
举例(格式1)
举例: var i:integer; r:real; begin i:=0; try
r:=8/i; showmessage(floattostr(r)); except showmessage('除数为零'); end; end;
Try…except语句(格式2)
格式2: Try
Try…except语句(格式3)
基于Delphi的异常处理实现方法
基于Delphi的异常处理实现方法【摘要】本文重点介绍了Delphi对异常处理的机制;针对程序运行过程中产生的异常情况,运用Delphi开发工具并结合实例介绍了异常处理机制在程序设计中对异常处理的实现方法。
【关键词】Delphi;异常处理;保护块;异常类0 引言软件无论在测试中,还是常规运行时,都不可避免会发生由于软件设计、编码或操作人员非法操作,或者是数据库、网络线路等软硬件错误而引发应用程序异常。
在Delphi的集成开发环境(IDE)中提供了一个完善的内置调试器,可以帮助你发现大部分程序错误。
但并不是所有的错误都可以被发现,而且当程序涉及到与外设的数据交换或操作外设,如要求用户输入、读写磁盘等时,错误的发生是程序无法控制的,如输入非法字符、磁盘不能读写等。
这些情况不仅回导致应用程序异常终止而且可能引起系统的崩溃。
针对这些问题,Delphi同时提供了一套强大的异常处理机制。
巧妙地利用它,可以使你的程序更为强健,使用更为友好。
现本人结合实际,详细讨论Delphi中异常处理及其实现方法。
1 Delphi异常处理机制Delphi异常处理机制建立在保护块(Protected Blocks)的概念上。
所谓保护块是用保留字try和end封装的一段代码。
保护块的作用是当应用程序发生错误时自动创建一个相应的异常类(Exception)。
程序可以捕获并处理这个异常类,以确保程序的正常结束以及资源的释放和数据不受破坏。
如果程序不进行处理,则系统会自动提供一个消息框,告诉用户用处产生的原因,并终止程序的执行。
1.1 异常类异常类是Delphi异常处理机制的核心,也是Delphi异常处理的主要特色。
Delphi通过异常类Exception来实现异常处理机制。
Exception类是其它所有异常类的基类,其它异常类均是Exception类的子类。
Exception类定义在单元SysUtil 中,定义如下(对于不常用的成员没有列出):{SysUtil单元中}Exception=class(Tobject)PrivateFmessage:Pstring;FhelpContext:Longint;Function GetMessage:String;Procedure SetMessage(const Value;String);Publicconstructor Create(const Msg:String);constructor CreateFmt(const Msg:String;const Args:array of const);…destructor Destroy;override;property HelpContext:Longint;property Message:String;property MessagePrt:Pstring;end;当然,用户也可以象定义其它类一样来定义自己的异常类。
delphitryexcept语句和tryfinally语句用法以及区别
delphitryexcept语句和tryfinally语句⽤法以及区别1、当执⾏try...except之间的语句序列没有发⽣异常时,则忽略异常处理部分的语句,程序直接转移try...except..finally后⾯的语句处执⾏;2、Except括起来的语句,则只有在产⽣异常的情况下会被执⾏,其他情况⼀概不执⾏的。
3、Finally括起来的语句是铁定会被执⾏的,⽆论是否有异常产⽣;try//尝试执⾏{SomeCode}except//出错的时候执⾏, Except有特定的错误类型{SomeCode}end;try//尝试执⾏{SomeCode}finally//⽆论如何都强制执⾏{SomeCode}end;例:tryAge:=StrToInt(Edit1.Text);ShowMessage(Format('⽣于%d年',[YearOf(Now)-Age]));excepton EConvertError doshowmessage('输⼊编辑框的不是⼀个有效的数字!');on ERangeError doshowmessage('输⼊编辑框的年龄值太⼤!');end;保留字on…do⽤于判断异常类型。
必须注意的是:except后⾯的语句必须包含在某⼀个on…do模块中,⽽不能单独存在。
这⼜是同finally不同的⼀个地⽅。
异常处理try//成功失败都跳进finally语句⾥执⾏finallyend;try//失败才跳进 except⾥执⾏except on e:Exception doShowMessage(e.Message);end;例⼦:我写的⼀个服务procedure TDBMonitorService.Timer1Timer(Sender: TObject);vartSQL: string;tSAMPLEID,tJG,tCLASSES,tGUID,tTESTTIME,tC,tSi,tMn,tp,tS,tCu,tNi,tCR,tAS,tSN,tPB,tV,tAL,tTI,tSB,tBI,tMO, tLCH,tLGH,tQX,tSAMPLE,sSCBZ:string; MyArr: array[0..4] of string;i, nFH,j,k:Integer;begin Ansys := true; try //SYN_SIGN=1 已上报 SYN_SIGN=0 未上报 try with qry_erp do begin if Active then Close; SQL.Clear; SQL.Add('SELECT SAMPLEID, SYN_SIGN, nvl(FD_C,0) FD_C, nvl(FD_SI,0) FD_SI, nvl(FD_MN,0) FD_MN, nvl(FD_P,0) FD_P,'); SQL.Add('nvl(FD_S,0) FD_S, nvl(FD_CU,0) FD_CU, nvl(FD_NI,0) FD_NI, nvl(FD_CR,0) FD_CR, nvl(FD_AS,0) FD_AS, nvl(FD_SN,0) FD_SN,'); SQL.Add('nvl(FD_PB,0) FD_PB, nvl(FD_V,0) FD_V, nvl(FD_AL,0) FD_AL, nvl(FD_TI,0) FD_TI, nvl(FD_SB,0) FD_SB, nvl(FD_BI,0) FD_BI, nvl(FD_MO,0) FD_MO, SAMPLEOK, TESTTIME '); SQL.Add('FROM D1_FDSYTS_DATA WHERE SYN_SIGN=0 ORDER BY SENDTIME DESC'); Open; end; except on e:Exception do begin WriteLog(e.Message+'->数据库打开错误!'); Exit; end; end; if (not qry_erp.IsEmpty) then begin qry_erp.First; try while not qry_erp.Eof do begin tSQL := ''; sSCBZ:=''; tSAMPLEID := qry_erp.FieldByName('SAMPLEID').AsString; // 炉次号 ,炉罐号 ,去向(9-17-1234,123,A) tSAMPLE :=tSAMPLEID; j:=1; k:=0; for i:=0 to 2 do begin nFH:=pos(',',tSAMPLE); k:=k+nFH; if(nFH<>0) then begin if(j=1) then begin tLCH:=Trim(copy(tSAMPLEID,0,k-1)); end; if(j=2)then begin tLGH:=Trim(copy(tSAMPLE,0,pos(',',tSAMPLE)-1)); tQX:=copy(tSAMPLE,nFH+1,length(tSAMPLE)); end; tSAMPLE:=copy(tSAMPLE,nFH+1,length(tSAMPLE)); j:=j+1; end else if(nFH=0) then break; end; if(j=3)then begin tC := qry_erp.FieldByName('FD_C').AsString ; tSi := qry_erp.FieldByName('FD_SI').AsString; tMn := qry_erp.FieldByName('FD_MN').AsString; tp := qry_erp.FieldByName('FD_P').AsString; tS := qry_erp.FieldByName('FD_S').AsString; tCu:= qry_erp.FieldByName('FD_CU').AsString; tNi:= qry_erp.FieldByName('FD_NI').AsString; tCR := qry_erp.FieldByName('FD_CR').AsString; tAS := qry_erp.FieldByName('FD_AS').AsString; tSN := qry_erp.FieldByName('FD_SN').AsString; tPB := qry_erp.FieldByName('FD_PB').AsString; tV := qry_erp.FieldByName('FD_V').AsString; tAL:= qry_erp.FieldByName('FD_AL').AsString; tTI:= qry_erp.FieldByName('FD_TI').AsString; tSB:= qry_erp.FieldByName('FD_SB').AsString; tBI:= qry_erp.FieldByName('FD_BI').AsString; tMO:= qry_erp.FieldByName('FD_MO').AsString; tJG:= qry_erp.FieldByName('SAMPLEOK').AsString; tTESTTIME:= qry_erp.FieldByName('TESTTIME').AsString; //铁⽔化验时间 tCLASSES:=''; MyArr[0]:=''; MyArr[1]:=''; MyArr[2]:=''; MyArr[3]:=''; MyArr[4]:=''; if((tC<>'') and (tSi<>'') and (tS<>'') and (tp<>'') and (tMn<>'') ) then begin if( (StrToFloat(tC)>=3.5) and (StrToFloat(tSi)<=0.8) and (StrToFloat(tS)<=0.05) and (StrToFloat(tp)<=0.17) and (StrToFloat(tMn)<=1)) then begin MyArr[0]:='A'; end; end; if((tC<>'') and (tSi<>'') and (tS<>'') and (tp<>'') and (tMn<>'') and (tCR<>'') and (tNi<>'') and (tCu<>'') and (tMO<>'') and (tAS<>'')) then begin if( (StrToFloat(tC)>=3.5) and (StrToFloat(tSi)>=0.2) and (StrToFloat(tSi)<=0.6) and (StrToFloat(tS)<=0.05) and (StrToFloat(tp)<=0.14) and StrToFloat(tMn)<=1) and (StrToFloat(tCR)<=0.10) and (StrToFloat(tNi)<=0.10) and (StrToFloat(tCu)<=0.05) and (StrToFloat(tMO)<=0.05) and (StrToFloat(tAS)<=0.008) ) then begin MyArr[1]:='B'; end; end; if((tC<>'') and (tSi<>'') and (tS<>'') and (tp<>'') and (tMn<>'') and (tCR<>'') and (tNi<>'') and (tCu<>'') and (tMO<>'') and (tAS<>'') and (tPB<>'') and (tSN<>'') and (tSB<>'') and (tBI<>'') and (tTI<>'')) then begin if( (StrToFloat(tC)>=3.5) and (StrToFloat(tSi)>=0.2) and (StrToFloat(tSi)<=0.6) and (StrToFloat(tS)<=0.05) and (StrToFloat(tp)<=0.14) and (StrToFloat(tMn)<=1) and (StrToFloat(tCR)<=0.10) and (StrToFloat(tNi)<=0.10) and (StrToFloat(tCu)<=0.05) and (StrToFloat(tMO)<=0.05) and (StrToFloat(tAS)<=0.008) and (StrToFloat(tPB)<=0.007) and (StrToFloat(tSN)<=0.005) and (StrToFloat(tSB)<=0.005) and (StrToFloat(tBI)<=0.007) and (StrToFloat(tTI)<=0.050) ) then begin MyArr[2]:='C'; end; end; if((tC<>'') and (tSi<>'') and (tS<>'') and (tp<>'') and (tMn<>'') and (tCR<>'') and (tNi<>'') and (tCu<>'') and (tMO<>'') and (tAS<>'') and (tPB<>'') and (tSN<>'') and (tSB<>'') and (tBI<>'') and (tTI<>'')) then begin if( (StrToFloat(tC)>=3.5) and (StrToFloat(tSi)>=0.2) and (StrToFloat(tSi)<=0.6) and (StrToFloat(tS)<=0.05) and (StrToFloat(tp)<=0.14) and (StrToFloat(tMn)<=1) and (StrToFloat(tCR)<=0.05) and (StrToFloat(tNi)<=0.05) and (StrToFloat(tCu)<=0.05) and (StrToFloat(tMO)<=0.05) and (StrToFloat(tAS)<=0.005) and (StrToFloat(tPB)<=0.005) and (StrToFloat(tSN)<=0.003) and (StrToFloat(tSB)<=0.003) and (StrToFloat(tBI)<=0.005) and (StrToFloat(tTI)<=0.050) ) then begin MyArr[3]:='D'; end; end; if((tC<>'') and (tSi<>'') and (tS<>'') and (tp<>'') and (tMn<>'') and (tCR<>'') and (tNi<>'') and (tCu<>'') and (tMO<>'') and (tAS<>'') and (tSN<>'') and (tTI<>'')) then begin if( (StrToFloat(tC)>=3.5) and (StrToFloat(tSi)>=0.2) and (StrToFloat(tSi)<=0.6) and (StrToFloat(tS)<=0.05) and (StrToFloat(tp)<=0.14) and (StrToFloat(tMn)<=1) and (StrToFloat(tCR)<=0.03) and (StrToFloat(tNi)<=0.03) and (StrToFloat(tCu)<=0.03) and (StrToFloat(tMO)<=0.03) and (StrToFloat(tAS)<=0.006) and (StrToFloat(tSN)<=0.007) and (StrToFloat(tTI)<=0.050) ) then begin MyArr[4]:='E'; end; end; for i:=0 to 4 do begin if MyArr[i] <>'' then tCLASSES:=tCLASSES+ MyArr[i]+','; end; tCLASSES:=copy(tCLASSES,1,length(tCLASSES)-1); with qry_scyx do begin if Active then Close; SQL.Clear; SQL.Add('SELECT * FROM SJCJ_GLTSHY_TEST where LCH='''+tLCH+''' and LGH='''+tLGH+''' and yxbz=''1'' '); Open; end; if qry_scyx.IsEmpty then begin tSQL := 'insert into SJCJ_GLTSHY_TEST(BH,LCH,LGH,C,SI,MN,S,P,JG,TSHYJLSJ,V,TI,CR,NI,PB,SN,AS_,SB,BI,MO,CU,CR2,NI2,PB2,SN2,AS_2,SB2,BI2,MO2,CU2,TI2,V2,CLAS SES,yxbz,qx,CJR)' +' values(sys_guid(),'''+tLCH+''','''+tLGH+''','''+tC+''','''+tSi+''','''+tMn+''','''+tS+''','''+tp+''','''+tJG+''',to_date('''+tTESTTIME+''',''yyyy-mm-dd hh24:mi:ss'') ' +' ,'''+tV+''','''+tTI+''','''+tCR+''','''+tNi+''','''+tPB+''','''+tSN+''','''+tAS+''','''+tSB+''','''+tBI+''','''+tMO+''','''+tCu+''' ' +' ,'''+tCR+''','''+tNi+''','''+tPB+''','''+tSN+''','''+tAS+''','''+tSB+''','''+tBI+''','''+tMO+''','''+tCu+''','''+tTI+''','''+tV+''','''+tCLASSES+''',''1'','''+tQX+''',''FDSY'')'; writelog('Insert: '+tSQL); end else begin //如果有数据则更新 tGUID := qry_scyx.FieldByName('BH').AsString; tSQL := ' update SJCJ_GLTSHY_TEST set C='''+tC+''',SI='''+tSi+''',MN='''+tMn+''',S='''+tS+''',P='''+tp+''',JG= '''+tJG+''',TSHYJLSJ=to_date('''+tTESTTIME+''',''yyyy-mm-dd hh24:mi:ss'') ' +' ,V='''+tV+''',TI='''+tTI+''' ,CR='''+tCR+''',NI='''+tNi+''',PB='''+tPB+''',SN='''+tSN+''',AS_='''+tAS+''',SB='''+tSB+''' ' +' ,BI='''+tBI+''',MO='''+tMO+''',CU='''+tCu+''',CR2='''+tCR+''',NI2='''+tNi+''',PB2='''+tPB+''',SN2='''+tSN+''',AS_2='''+tAS+''',SB2='''+tSB+''' ' +' , BI2='''+tBI+''',MO2='''+tMO+''',CU2='''+tCu+''',TI2='''+tTI+''',V2='''+tV+''',CLASSES='''+tCLASSES+''' ' +' where BH='''+tGUID+''' '; writelog('Update: '+tSQL); end; sSCBZ:='1'; end else begin sSCBZ:='2'; end; if (sSCBZ<>'') then begin try if (tSQL<>'') then begin with qry_scyx do begin if Active then Close; SQL.Text := tSQL; ExecSQL; end; end; except on e:Exception do begin WriteLog('执⾏oracle语句时:'+e.Message+';SQL语句:'+tSQL); qry_erp.Next; Continue; WriteLog('下⼀条记录'); end; end; try //更新Accesss qry_erp.Edit; qry_erp.FieldByName('SYN_SIGN').AsString := sSCBZ; //更新已上报标志 except on e:Exception do WriteLog('更新Access上报标志时 : '+e.Message); end; end; qry_erp.Next; end; except on e:Exception do WriteLog('线程执⾏循环体:'+e.Message); end; end; finally Ansys := false; end;end;。
程序异常处理try-except用法
程序异常处理try-except用法try-except是Python中用于处理程序异常的语句。
它的基本用法是将可能发生异常的代码放在try语句块中,然后在except语句块中处理异常情况。
try语句块中的代码会按顺序执行,当遇到异常时,程序会跳转到对应的except语句块进行处理。
except语句块可以接收一个或多个异常类型作为参数,也可以省略参数来捕获所有类型的异常。
如果except语句块中的代码处理了异常,那么程序将继续执行接下来的代码;如果except语句块中的代码没有处理异常,那么异常将被传递给上一级的try语句块或者全局异常处理器。
以下是一个简单的try-except的例子:```pythontry:num1 = int(input("请输入一个整数:"))num2 = int(input("请输入另一个整数:"))result = num1/num2print("相除的结果是:", result)except ValueError:print("输入的不是整数")except ZeroDivisionError:print("除数不能为0")except Exception as e:print("发生了一个异常:", e)```在上面的例子中,try语句块中的代码尝试进行除法运算,如果用户输入的是非整数,则会捕获ValueError异常。
如果用户输入的除数为0,则会捕获ZeroDivisionError异常。
如果用户输入其他类型的异常,则会捕获Exception类型的异常,并打印出异常的具体信息。
除了使用多个except语句块来捕获不同类型的异常,还可以使用单个except语句块来捕获多个类型的异常,并使用元组来指定需要捕获的异常类型。
例如:```pythontry:#代码块except (ValueError, ZeroDivisionError):#异常处理代码```在实际使用中,程序员可以根据具体情况来处理异常,例如打印错误信息、抛出新的异常、进行数据回滚等操作,以保证程序的稳定性和健壮性。
try()和except()的用法
试 () 和 except()是 Python 编程语言中异常处理的核心功能。
在Python 中,当程序出现错误或异常时,可以使用 try 和 except 语句来捕获并处理这些异常。
try 语句中包含可能发生异常的代码块,而except 语句用于指定在出现特定异常时应该执行的代码。
1. try 和 except 的基本用法在 Python 中,我们可以使用 try 和 except 语句来处理可能会出现异常的代码块。
try 语句中包含我们希望执行的代码,如果这些代码出现了异常,程序就会跳转到 except 语句中执行相应的异常处理代码。
这样可以确保程序在遇到异常时不会崩溃,而是可以优雅地处理异常并继续执行。
2. try 和 except 的深入应用除了基本的 try 和 except 用法外,我们还可以使用多个 except 语句来捕获和处理不同类型的异常。
这样可以针对不同类型的异常进行不同的处理,使程序更加健壮和可靠。
另外,我们还可以在 except 语句中使用 else 和 finally 子句,分别在没有发生异常和无论是否发生异常时执行特定的代码块。
3. 个人观点和理解在我看来,try 和 except 的使用非常重要,它可以使程序在出现异常时有机会进行自我修复或向用户提供友好的提示信息,而不是直接崩溃。
合理使用 try 和 except 也可以使程序更加健壮,能够应对各种意外情况,提高程序的稳定性和可靠性。
4. 总结回顾通过对 try 和 except 的深入讨论,我们可以看到它们在 Python 异常处理中的重要性和灵活性。
合理地使用 try 和 except 可以使程序更加稳定可靠,同时也能够提高用户体验和程序的健壮性。
在编写 Python 代码时,我们应该充分利用 try 和 except 的功能,合理处理可能发生的异常情况,从而提升代码质量和可靠性。
以上就是对 try() 和 except()的用法的深度和广度兼具的探讨,希望对你有所帮助。
函数中异常处理的方法
函数中异常处理的方法在函数中处理异常情况是确保代码健壮性和稳定性的重要步骤。
异常处理可以通过使用适当的异常处理结构来实现,这些结构可以在函数内部捕获和处理异常。
以下是在函数中处理异常情况的一些常见方法:1.使用try-except块:在函数中使用try-except块来捕获和处理异常。
将可能引发异常的代码放在try块中,然后在except块中处理异常。
可以捕获特定类型的异常或捕获所有异常。
def divide_numbers(a, b):try:result = a / bexcept ZeroDivisionError:result = "Cannot divide by zero"return result2.使用多个except块处理不同异常:如果需要处理多个不同类型的异常,可以使用多个except块。
每个except块可以处理特定类型的异常。
def calculate_square(number):try:result = number ** 2except TypeError:result = "Input must be an integer or float"except ValueError:result = "Input must not be negative"return result3.使用finally块:finally块包含的代码无论是否发生异常都会执行。
这对于清理资源、关闭文件或执行其他需要在函数结束时完成的操作很有用。
def open_file(filename):try:file = open(filename, 'r')except FileNotFoundError:file = Nonefinally:if file:file.close()4.使用raise语句引发异常:在函数中,可以使用raise语句手动引发一个异常。
Delphi异常处理机制
Delphi异常处理机制Delphi的异常处理⽅式有两种:try...except...end;try...finally...end;。
try...except主要⽤于捕获异常,只有出现异常的时候才会执⾏except部分。
try...finally主要⽤于资源释放,⽆论try语句块是否有异常都会执⾏finally语句块。
如下⾯的代码:tryraise exception.create('发现异常'); //在try语句块中抛出⼀个异常excepton e:Exception do//捕获异常beginshowMessage(e.message);end;end;⽤try..except是不会出现异常提⽰信息的对话框,需要⾃⼰主动去show出异常信息。
⽽try..finally.则会出现异常提⽰信息。
try..except和try..finally可以相互嵌套。
使⽤on e:Exception do可以精确处理特定的异常。
Exception是所有异常类的基类,Delphi内部就定义了处理常见异常的异常类(在SysUtils单元中),也可以从Exception继承定义⾃⼰的异常类使⽤raise语句可以抛出⼀个异常:EMyException=class(Exception)end;trytryraise EMyException.Create('我⾃⼰的异常');excepton e:EMyException doshowMessage(e.message);end;finallyshowMessage('我始终被执⾏');end。
delphi finally用法
delphi finally用法在Delphi编程中,finally块是一种特殊的代码块,无论前面的代码是否出现异常,finally块中的代码总是会被执行。
这对于释放资源、关闭文件、断开数据库连接等非常重要。
本文将介绍finally块的使用方法,以及如何处理异常。
一、finally块的基本用法在Delphi中,finally块是在try...except结构之外定义的代码块。
无论前面的代码是否出现异常,finally块中的代码总是会被执行。
这意味着无论try 块中的代码是否出现异常,finally块中的代码都会被执行。
这对于释放资源、关闭文件、断开数据库连接等非常重要。
下面是一个基本的finally块的例子:```delphiprocedureTForm1.Button1Click(Sender:TObject);vari:Integer;begintry//一些可能会抛出异常的代码fori:=1to10dobeginifimod2=0thenraiseException.Create('偶数不能被2整除');end;finally//在这里放置需要执行的代码,无论前面的代码是否出现异常ShowMessage(IntToStr(i));//这将在try块中的代码执行完毕后被执行end;```在这个例子中,无论try块中的代码是否出现异常,finally块中的代码都会被执行。
这可以确保在异常发生后仍然能够正确地处理和清理资源。
二、finally块与异常处理在Delphi中,try...except结构用于捕获和处理异常。
如果try块中的代码抛出一个异常,程序将跳转到相应的except块进行处理。
如果except块中没有提供处理代码,那么程序将会终止并显示异常消息。
但是,如果except块中存在处理代码,那么程序将会跳过异常并继续执行后续的代码。
因此,使用try...except结构时需要谨慎处理异常,避免影响程序的正常执行。
delphi语法
delphi语法关键字absolute 指令 (变量)abstract 指令 (方法)and 运算符 (布尔)array 类型as 运算符 (RTTI)asm 语句assembler 向后兼容 (汇编)at 语句 (异常处理)automated 访问类别符 (类)begin 块标记case 语句cdecl 函数调用协定class 类型const 声明或指令(参数)constructor 特殊方法contains 运算符 (集合)default 指令 (属性)destructor 特殊方法dispid dispinterface 界面类别符dispinterface 类型div 运算符do 语句downto 语句 (for)dynamic 指令 (方法)else 语句 (if 或 case)end 块标记except 语句 (异常处理)export 向后兼容 (类)exports 声明external 指令 (函数)far 向后兼容 (类)file 类型finalization 单元结构finally 语句 (异常处理)for 语句forward 函数指令function 声明goto 语句if 语句implementation 单元结构implements 指令 (属性)in 运算符 (集合) - 工程结构index 指令 (dipinterface界面) inherited 语句initialization 单元结构inline 向后兼容 (见 asm) interface 类型is 运算符 (RTTI)label 声明library 程序结构message 指令 (方法)mod 运算符 (数学)name 指令 (函数)near 向后兼容 (类)nil 数值nodefault 指令 (属性)not 运算符 (布尔)object 向后兼容 (类)of 语句 (case)on 语句 (异常处理)or 运算符 (布尔)out 指令 (参数)overload 函数指令override 函数指令package 程序结构 (控件包) packed 指令 (记录)pascal 函数调用协定private 访问类别符 (class) procedure 声明program 程序结构property 声明protected 访问类别符 (类) public 访问类别符 (类) published 访问类别符 (类) raise 语句 (异常处理)read 属性类别符readonly dispatch 界面类别符record 类型register 函数调用协定reintroduce 函数指令repeat 语句requires 程序结构 (控件包) resident 指令 (函数) resourcestring 类型safecall 函数调用协定set 类型shl 运算符 (数学)shr 运算符 (数学)stdcall 函数调用协定stored 指令 (属性)string 类型then 语句 (if)threadvar 声明to 语句 (for)try 语句 (异常处理)type 声明unit 单元结构until 语句uses 单元结构var 声明virtual 指令 (方法)while 语句with 语句write 属性类别符writeonly dispatch 界面类别符xor 运算符 (布尔)优先法则单目运算符 (最高优先级)@ 取变量或函数的地址(返回一个指针)not 逻辑取反或按位取反乘除及按位运算符* 相乘或集合交集/ 浮点相除div 整数相除mod 取模 (整数相除的余数)as 程序运行阶段类型转换 (RTTI运算符)and 逻辑或按位求和shl 按位左移shr 按位右移加减运算符+ 相加、集合并集、字符串连接或指针增加一个偏移量- 相减、集合差集或指针减少一个偏移量or 逻辑或按位或运算xor 逻辑或按位异或运算关系及比较运算符(最低优先级)= 判断是否相等<> 判断是否不相等< 判断是否小于> 判断是否大于<= 判断是否小于或等于,或是否是一个集合的子集>= 判断是否大于或等于,或是否是一个集合的父集in 判断是否是集合成员is 判断对象是否类型兼容 (又一个RTTI运算符)Boolean (ByteBool WordBool LongBool)CharIntegerShortInt -128~127Byte 0~255SmallInt -32768~32767Word 0~65535LongInt LongWordInt64Interger CardinalAnsiCharWidChar#=Chr(),把数字转化为字符,Ord为相反,把字符转化为数字#9 Tab键#10 换行#13 回车类型转换Chr 将一个有序数据转换为一个ANSI字符Ord 将一个有序类型值转换为它的序号Round 转换一个实型值为四舍五入后的整型值Trunc 转换一个实型值为小数截断后的整型值Int 返回浮点数的整数部分IntToStr 将数值转换为字符串IntToHex 将数值转换为十六进制数字符串StrToInt 将字符串转换为一个整型数,如字符串不是一个合法的整型将引发异常StrToIntDef 将字符串转换为一个整数,如字符串不合法返回一个缺省值Val 将字符串转换为一个数字(传统Turbo Pascal例程用于向后兼容)Str 将数字转换为格式化字符串(传统Turbo Pascal例程用于向后兼容)StrPas 将零终止字符串转换为Pascal类型字符串,在32位Delphi中这种类型转换是自动进行的StrPCopy 拷贝一个Pascal类型字符串到一个零终止字符串, 在32位Delphi中这种类型转换是自动进行的StrPLCopy 拷贝Pascal类型字符串的一部分到一个零终止字符串FloatToDecimal 将一个浮点数转换为包含指数、数字及符号的十进制浮点记录类型FloatToStr 将浮点值转换为缺省格式的字符串FloatToStrF 将浮点值转换为特定格式的字符串FloatToText 使用特定格式,将一个浮点值拷贝到一个字符串缓冲区FloatToTextFmt 同上面例程,使用特定格式,将一个浮点值拷贝到一个字符串缓冲区StrToFloat 将一个Pascal字符串转换为浮点数TextToFloat 将一个零终止字符串转换为浮点数Dec 将例程中的参数值递减1或一个特定的值,其中特定值可在第二个可选参数中定义Inc 将例程中的参数值增加1或一个特定的值Odd 如果参数为奇数返回真Pred 根据参数在其数据类型定义中的序列,返回参数值的前驱值Succ 返回参数值的后继值Ord 返回参数值在其数据类型值集合中的序号Low 返回参数对应的有序数据类型的最小取值High 返回参数对应的有序数据类型的最大取值实数:SingleDoubleExtendedReal {$REALCOMPATIBILITY ON}据说不标准,要兼容旧的格式使用这个宏CompCurrencyTDateTime = type Double为了后续使用或直接用于变量,需要给自定义类型命名。
python异常处理:try_except语句;try_finally语句;raise语句
python异常处理:try_except语句;try_finally语句;raise语句python标准异常异常名称描述BaseException所有异常的基类SystemExit解释器请求退出KeyboardInterrupt⽤户中断执⾏(通常是输⼊^C)Exception常规错误的基类StopIteration迭代器没有更多的值GeneratorExit⽣成器(generator)发⽣异常来通知退出StandardError所有的内建标准异常的基类ArithmeticError所有数值计算错误的基类FloatingPointError浮点计算错误OverflowError数值运算超出最⼤限制ZeroDivisionError除(或取模)零 (所有数据类型)AssertionError断⾔语句失败AttributeError对象没有这个属性EOFError没有内建输⼊,到达EOF 标记EnvironmentError操作系统错误的基类IOError输⼊/输出操作失败OSError操作系统错误WindowsError系统调⽤失败ImportError导⼊模块/对象失败LookupError⽆效数据查询的基类IndexError序列中没有此索引(index)KeyError映射中没有这个键MemoryError内存溢出错误(对于Python 解释器不是致命的)NameError未声明/初始化对象 (没有属性)UnboundLocalError访问未初始化的本地变量ReferenceError弱引⽤(Weak reference)试图访问已经垃圾回收了的对象RuntimeError⼀般的运⾏时错误NotImplementedError尚未实现的⽅法SyntaxError Python 语法错误IndentationError缩进错误TabError Tab 和空格混⽤SystemError⼀般的解释器系统错误TypeError对类型⽆效的操作ValueError传⼊⽆效的参数UnicodeError Unicode 相关的错误UnicodeDecodeError Unicode 解码时的错误UnicodeEncodeError Unicode 编码时错误UnicodeTranslateError Unicode 转换时错误Warning警告的基类DeprecationWarning关于被弃⽤的特征的警告FutureWarning关于构造将来语义会有改变的警告OverflowWarning旧的关于⾃动提升为长整型(long)的警告PendingDeprecationWarning关于特性将会被废弃的警告RuntimeWarning可疑的运⾏时⾏为(runtime behavior)的警告SyntaxWarning可疑的语法的警告UserWarning⽤户代码⽣成的警告1、try-except语句2、try-finally语句3、raise语句参考:⼀、try-except语句语句格式:try:检测范围except Exception [as reason]:出现异常(Exception)后的处理代码try:<语句> #运⾏别的代码except <名字>:<语句> #如果在try部份引发了'name'异常except <名字>,<数据>:<语句> #如果引发了'name'异常,获得附加的数据else:<语句> #如果没有异常发⽣ try的⼯作原理是,当开始⼀个try语句后,python就在当前程序的上下⽂中作标记,这样当异常出现时就可以回到这⾥,try⼦句先执⾏,接下来会发⽣什么依赖于执⾏时是否出现异常。
delphi异常和错误处理
异常和错误处理(基于Delphi/VCL)有人在看了我的“如何将界面代码和功能代码分离(基于Delphi/VCL)”之后,提到一个问题,就是如何对服务端的类的错误进行处理。
在基于函数的结构中,我们一般使用函数返回值来标明函数是否成功执行,并给出错误类型等信息。
于是就会有如下形式的代码:RetVal := SomeFunctionToOpenFile();if RetVal = E_SUCCESSED then......else if RetVal = E_FILENOTFOUND then......else if RetVal = E_FILEFORMATERR then......else then......使用返回错误代码的方法是非常普遍的,但是使用这样的方法存在2个问题:1、造成冗长、繁杂的分支结构(大量的if或case语句),使得控制流程变得复杂2、可能会有没有被处理的错误(函数调用者如果不判断返回值的话)而异常是对于错误处理的面向对象的解决方案。
它可以报告错误,但需要知道的是,并非由于错误而引发了异常,而仅仅是因为使用了raise。
在Object Pascal中,抛出异常使用的是raise保留字。
在任何时候(即使没有错误发生),raise都将会导致异常的发生。
异常可以使得代码从异常发生处立刻返回,从而保护其下面的敏感代码不会得到执行。
通过异常从函数返回和正常从函数返回(执行到函数末尾或执行了Exit)对于抛出异常的函数本身来说是没有什么区别的。
区别在于调用者处,通过异常返回后,执行权会被调用者的try...e xcept块所捕获(如果它们存在的话)。
如果调用者处没有try...except块的话,将不会继续执行后续语句,而是返回更上层的调用者,直至找到能够处理该异常的try...except块。
异常被处理后,将继续执行try...except块之后的语句,控制权就被留在了处理异常的这一层。
Delphi中try…except…end与try…finally…end的应用
Delphi中try…except…end与try…finally…end的应用Delphi中try…except…end与try…finally…end的应用在Delphi的中,提供了try…except…end和try…finally…end语句。
本人在过去得编程过程中,深刻地体会到,这两个语句的合理使用,可以带来很多好处。
一方面可以使程序结构更加清晰,使得我们不用编写大量的意外情况处理的代码;另一方面使我们可以很容易的编写出十分稳定可靠的程序。
一、我们为什么要使用try意外控制语句?假设我们现在要编写一个程序,在这个程序中需要对一个远程文件进行一系列操作。
先看如下代码:代码1:tryOpenRemoteFile;UpdateRemoteFile;CloseRemoteFile;excepton E: Exception dobeginCloseRemoteFile;ShowErrorMessage;end;end;这段代码中OpenRemoteFile和UpdateRemoteFile都有可能由于各种意外情况导致错误,当错误发生后,错误句柄将被捕获,继而执行on E: Exception do之后的语句。
设想如果Delphi没有提供try语句,那么我们的程序将被写成:代码2:if OpenRemoteFile thenbeginif UpdateRemoteFile thenCloseRemoteFile;elsebeginCloseRemoteFile;ShowErrorMessage;end;endelseShowErrorMessage;不用说,这两段程序谁更“好”,谁更不容易出错。
而且在实际使用中可能需要对远程文件做更复杂的操作。
二、try语句的一些简单应用。
在Delphi编程中常常遇到一些必须互相配对的语句,例如:对象的创建和释放;文件的打开和关闭;TDataSet的打开和关闭……。
Delphi异常处理与程序调试(2)
Delphi异常处理与程序调试(2)12.3 异常响应异常响应为开发者提供了一个按自己的需要进行异常处理的机制。
try …except …end形成了一个异常响应保护块。
与finally不同的是:正常情况下except 后面的语句并不被执行,而当异常发生时程序自动跳到except,进入异常响应处理模块。
当异常被响应后异常类自动清除。
下面的例子表示了文件打开、删除过程中发生异常时的处理情况:uses Dialogs;varF: Textfile;beginOpenDialog1.Title := 'Delete File';if OpenDialog1.Execute thenbeginAssignFile(F, OpenDialog1.FileName);tryReset(F);if MessageDlg('Erase ' +OpenDialog1.FileName + '?',mtConfirmation, [mbYes, mbNo], 0) = mrYes thenbeginSystem.CloseFile(F);Erase(F);end;excepton EInOutError doMessageDlg('File I/O error.', mtError, [mbOk], 0);on EAccessDenied doMessageDlg('File access denied.', mtError, [mbOk], 0);end;end;end.保留字on…do用于判断异常类型。
必须注意的是:except后面的语句必须包含在某一个on…do模块中,而不能单独存在。
这又是同finally不同的一个地方。
12.3.1 使用异常实例上面所使用的异常响应方法可总结为如下的形式:on ExceptionType do{响应某一类的异常}这种方法唯一使用的信息是异常的类型。
delphi try用法
delphi try用法Delphi中的try用法是用于处理异常的一种机制。
在编写程序时,无法预料到的错误可能会导致程序异常甚至崩溃,而try块可以帮助我们优雅地处理这些异常情况。
try块主要由try、except和finally这三个关键字组成。
try块内包含可能会引发异常的代码片段,而except块则用于捕获这些异常并进行相应的处理。
最后,finally块中的代码将会无论是否发生异常都会被执行。
在使用try块时,我们可以根据需要书写多个except块,用于捕获不同类型的异常。
在每个except块中,我们可以编写处理异常的代码,例如打印错误信息、给用户友好的提示、进行日志记录等操作。
除了捕获异常外,我们还可以通过raise语句手动引发异常。
这在某些情况下可以帮助我们主动检查和抛出特定的错误或者条件。
try块的使用可以有效地保护程序免受异常和错误的影响。
通过合理地处理异常,我们可以提高程序的健壮性和稳定性,同时提供更好的用户体验。
以下是一个简单的示例代码,展示了Delphi中try块的基本用法:```Delphitry// 可能引发异常的代码片段// ...except// 异常处理代码// ...finally// 无论是否发生异常都会执行的代码// ...end;```需要注意的是,在异常处理完成后,程序会继续执行try块后面的代码。
因此,我们应注意在异常发生后,通过合适的处理方式使程序能够继续正常运行。
总结来说,Delphi中的try块提供了一种优雅处理异常的机制,可以保护程序免受异常的影响,并提高程序的稳定性和用户体验。
合理使用try块,可以处理不同类型的异常,并提供相应的处理和恢复机制,以确保程序的正常运行。
高效处理异常的代码编写技巧
高效处理异常的代码编写技巧异常处理在代码编写中非常重要,它可以帮助我们捕获和处理程序运行过程中出现的错误。
高效处理异常的代码编写技巧可以提高程序的稳定性和可靠性。
下面是一些关于高效处理异常的代码编写技巧:1.使用try-except语句捕获异常:try-except语句可以用来捕获异常并进行相应的处理。
在try块中编写可能会出现异常的代码,如果出现异常则跳转到对应的except块中进行处理。
在except块中可以根据实际情况选择合适的处理方式,比如输出错误信息、记录日志、重新尝试执行等等。
2.使用多个except块处理不同类型的异常:根据实际情况,可以在try-except语句中使用多个except块来处理不同类型的异常。
这样可以针对不同的异常类型进行具体的处理,提高代码的健壮性。
通常来说,应该从具体的异常类型开始捕获,然后逐渐向上转化为更一般的异常类型。
3.使用else块处理没有发生异常的情况:在try-except语句中可以使用else块来处理没有发生异常的情况。
在else块中可以编写相应的代码逻辑,当try块中的代码正常执行完毕时,会执行else块中的代码。
这样可以使代码更加清晰和易读。
4.使用finally块进行清理操作:在try-except语句中可以使用finally块来进行清理操作,无论是否发生异常都会执行其中的代码。
finally块中的代码通常用于释放资源、关闭文件等操作。
使用finally块可以确保代码在发生异常时也能执行相应的清理操作,从而提高代码的可靠性。
5.抛出自定义的异常:除了捕获异常,还可以在代码中主动抛出异常。
可以使用raise语句来抛出特定类型的异常,并且可以在抛出异常时附带相应的错误信息。
抛出自定义的异常可以帮助我们更好地理解和调试代码。
6.使用异常层级结构:可以根据实际情况构建异常层级结构。
Python提供了一些内置的异常类,比如Exception、BaseException等。
delphi的异常及事务保护的常见问题浅析
delphi的异常及事务保护的常见问题浅析、exit方法原以为exit方法执行后,会马上退出过程,但是真正做了一个例子来测试后,才让我改变了想法。
请看下面这个例子,flag最后被赋值为´c´。
======================================================== ========================================varflag: string;begintryflag := ´a´;exit;flag := ´b´;finallyflag := ´c´;end;flag := ´d´;end;======================================================== ========================================分析:不论try子句如何结束,finally 子句总是被执行。
(多谢ylmg网友)2、一个能让整个系统停止运作的小问题在数据库系统设计中,经常使用事务操作来保证数据的完整性,但是设计不当,却容易产生比较大的影响,下面举个例子说明虽然数据完整性保证了,但是可能令到系统完全停止运作:======================================================= =========================================adoconnection1.begintrans;try...if application.messagebox(´是否确定删除?´, ´询问´,mb_yesno+mb_iconquestion)<>idyes then //(1)begin...end;application.messagebox(´操作失败´, ´警告´, mb_ok); //(2)exceptapplication.messagebox(´操作失败´, ´警告´, mb_ok); //(3)adoconnection1.rollbacktrans;end;====================================================== ==========================================分析:上面代码中的问题都是由于(1)、(2)、(3)的application.messagebox引起,但是引起问题的并不是application.messagebox本身,而是它将程序挂起,需要用户干预后,才继续执行后面的操作;如果用户这时候离开了计算机,或者没有对这些对话框进行确定操作的话,可想而知,整个系统因为这个事务没有结束而通通处于等待状态了。
python中异常处理的语法
python中异常处理的语法在Python中,异常处理使用try,except,finally和raise关键字。
以下是基本的语法:pythontry:# 尝试执行的代码块except ExceptionType:# 如果在try部分引发了'ExceptionType'异常,那么执行这部分# 处理异常的代码块except ExceptionType2:# 如果在try部分引发了'ExceptionType2'异常,那么执行这部分# 处理异常的代码块finally:# 无论是否发生异常,最后都会执行这部分的代码块如果try部分的代码块引发了一个异常,那么这个异常会被传递到第一个匹配的except 部分进行处理。
如果在try部分没有引发任何异常,那么finally部分的代码块将会被执行。
如果在try部分引发了一个异常,但是这个异常的类型并没有在except部分被提到,那么这个异常将会被传递出去,并且不会再执行finally部分的代码块。
此外,您也可以使用raise关键字来手动抛出一个异常:pythonraise ExceptionType("Error message")这会抛出一个类型为ExceptionType的异常,错误消息为"Error message"。
除了上述基本的异常处理语法,Python还有一些高级的异常处理特性。
1.多个except块:你可以在一个try块后面跟随多个except块,每个except块用来处理一种特定类型的异常。
例如:2.pythontry:# some code that may raise an exceptionexcept ValueError:# handle ValueError exceptionexcept TypeError:# handle TypeError exception1.异常的传递:如果你只想在捕获异常后简单地传递异常,而不想对其进行处理,你可以使用pass语句。
try-except-else-finally语句
try-except-else-finally语句try-except-else-finally是Python中的异常处理机制。
在编写程序时,我们经常会遇到各种错误和异常情况,这些可能是由于程序设计问题、输入错误、网络问题等原因导致的。
为了保证程序的稳定性和可靠性,在出现异常时能够及时处理问题,Python提供了try-except-else-finally语句来处理异常。
首先,我们来了解一下try语句块。
try语句块主要用于包裹可能引发异常的代码块。
当try语句块中的代码执行时,如果发生异常,就会跳到except 语句块中执行相应的异常处理代码;如果没有发生异常,就会跳过except 语句块,执行else语句块中的代码。
接下来,我们来看一下except语句块。
except语句块用于处理try语句块中发生的异常。
它可以捕捉指定类型的异常,也可以捕捉所有类型的异常。
当某个指定类型的异常发生时,except语句块中的代码会被执行;如果没有指定类型,或者发生的异常不属于指定类型,就会执行其他的except语句块或者跳出该异常处理机制。
然后,我们来了解一下else语句块。
else语句块用于处理在try语句块中没有出现异常时需要执行的代码。
如果try语句块中没有发生异常,就会跳过except语句块,执行else语句块中的代码。
使用else语句块可以将异常处理和正常逻辑分开,使程序的结构更加清晰。
最后,我们来看一下finally语句块。
finally语句块用于在无论是否发生异常的情况下都执行的代码。
无论try语句块是否发生异常,都会执行finally 语句块中的代码。
通常,我们会在finally语句块中进行一些清理工作,如关闭文件、释放资源等。
下面通过一个简单的实例来说明try-except-else-finally语句的使用:try:# 可能引发异常的代码块result = 10 / 0 # 这里会引发一个除零异常except ZeroDivisionError:# 指定捕捉ZeroDivisionError类型的异常print("除零异常")else:# 如果没有发生异常,执行该语句块print("没有发生异常")finally:# 无论是否发生异常,都会执行的语句块print("程序结束")在上述代码中,我们首先在try语句块中进行了除法运算,由于除数是0,会引发一个除零异常。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、异常的来源在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中提供的异常类掌握Delphi7环境下自定义异常的方法和异常处理的语法结构与实现异常什么是异常程序开发过程中,有编译期错误和运行期错误,编译期错误很容易发现,而运行期错误(逻辑错误和异常往往很难预料.为了程序的稳定性和可靠性,就需要对程序异常处理和保护. 异常:理解为一种特殊的事件,该事件发生时,程序的正常执行将被打断. 由程序导致的不正常情况是错误而不是异常,程序错误与异常不是相同的概念. 异常是为方便用户报告错误并处理错误而创建的机制,一般是由操作系统完成的. 运行期错误处理软件开发过程中,程序员必须提供适度的方式来处理不可避免的错误.一般方法如下: 1 传统方法 2 使用异常进行错误处理传统方法在Pascal早期版本中,程序员必须借助编译器开关和状态变量去检测和处理存在的错误. {$I-}{此编译器指令关闭I/O检测} Assign(InFile,InputName; Reset(InFile; {$I+}{此编译器指令恢复I/O检测} If IOResult0 then {错误处理代码}; 使用异常进行错误处理结构化异常处理是Delphi语言内建的特性.为我们处理异常提供了方便.处理异常有两方面: 1 异常处理可确保适当地恢复在应用程序中分配或改变的任何资源. 2 结构化异常处理为开发人员提供了一种一致的处理各种类型运行期错误的方式 Delphi7异常处理机制异常处理的基本思想是通过提供规范方式处理软,硬件错误的能力,使程序更加健壮. 异常处理可以将处理错误的代码与正常的逻辑处理代码相分离. Delphi 缺省的方式是在应用程序收到异常之前捕获异常.IDE会给出一个”预警”对话框,以指明应用程序将要产生异常. 异常处理机制是一种程序设计安全策略,它是建立在保护块思想上,通过try和end语句块对代码的封装确保在程序发生异常时,程序能够正常运行或释放所占用的资源. Delphi7异常处理机制传统程序设计中,用如下的伪代码方法来检查和处理程序错误: 执行一个任务 If 前一个任务未能正确执行执行错误处理执行下一个任务 If 前一个任务未能正确执行执行错误处理…… Delphi7异常处理机制例; try Age := StrToInt(Edit1.Text; ShowMessage(Format('生于%d年', [YearOf(Now - Age]; except on EConvertError do showmessage('输入编辑框的不是一个有效的数字!'; on ERangeError do showmessage('输入编辑框的年龄值太大!'; end;异常类 Delphi7根据异常类型定义了相应的异常类.所有异常类的基类都是Exception 类. Delphi7内置了大量的异常类,用户也可以通过Exception类自定义异常类. 记住异常类的要点: 1 异常类是响应不同异常现象的入口. 2 熟悉异常类的层次结构. Exception异常类 Exception是所有异常类的基类,它并不是以‟T'开头,而是以‟E'开头,它的派生类也是以‟E'开头的. Exception类定义于SysUtils单元中. Exception 类最常用的方法是Create方法: Constructor Create(const Msg:string;Exception.Create(…我自己创建的异常!‟; 该方法用于创建一个异常类的实例,也可以显示错误信息,也可直接用这个方法提交一个异常raise Exception.Create(…我抛出的异常!‟; 例: try raise Exception.Create('我抛出的异常!'; except on E: Exception do showmessage('异常类名称:' + E.ClassName + #13#10 + '异常信息:' + E.Message; end;Delphi7内置的异常类 Delphi7根据异常现象的类型定义了相应的异常类,这些异常类又称为Delphi7内置的异常类. 具体分为运行时库异常类,对象异常类和组件异常类三大类. 运行时库异常类(RTL 运行时库异常类可分为以下几种: 1 整数计算异常 2 浮点计算异常 3 硬件异常 4 堆异常 5 输入输出异常(I/O异常 6 字符转换异常7 类型转换异常 8 哑异常整数计算异常 EIntError 整数计算异常(基类 EDivByZero 整数除0溢处 EIntOverFlow 整数溢出 ERangeError 整数越界浮点计算异常EMathError 浮点计算异常(基类 EInvalidOp 无效浮点操作指令 Eoverflow 浮点操作上溢 Eunderflow 浮点操作下溢 EZeroDivide 浮点计算除0 硬件异常EProcessorException 硬件异常(基类 ESingleStep 应用程序产生单步中断 Ebreakpoint 应用程序产生断点中断 Efault 故障(继承EProcessorException,也是基类 EStackFault 对处理器栈段的非法访问 EPageFault 内存管理器无法正确使用交换文件 EGPFault 保护性错误,一般由未初始化指针或对象造成 EInvalidOpCode 处理器遇到未定义指令堆异常和(I/O异常堆异常: EOutOfMemory 堆中没有足够的内存完成操作EInvalidPointer 试图访问一个堆外的指针 (I/O异常 EInOutError DOS输入/输出错误字符转换/类型转换异常和哑异常字符转换异常 EConvertError 数字到字符串或字符串到数字转换错误类型转换异常 EInvalidCast 类型转换异常哑异常 EAbort 调用Abort产生,不显示错误提示框对象异常类对象异常类是针对非组件对象引发的异常而定义的. 对象异常类包括: 1 流异常类 2 打印异常类 3 图形异常类 4 字符串链表异常类流异常类流异常是指在程序中进行与流相关的操作时产生的异常.流异常类的基类是EStreamError,其他流异常类都直接或间接从它派生. 派生关系见书48页图打印异常打印异常是由于应用程序向不存在的打印机发送打印命令或由于某种原因打印工作无法送到打印机时引发的. 打印异常类为Eprinter,定义于Printers单元图形异常图形异常主要包括EInvalidGraphic和 EInvalidGraphicOperation两个类均定义于Graphics单元 EInvalidGraphic异常满足下列情况之一时引发: 当应用程序试图向一个并不包含合法的位图,图象,元文件或用户自定义图形类型的文件中装入图象时. 当应用程序试图装入不可识别扩展名的文件时当图象与LoadFromClipboardFormat 或SaveToClipboardFormat中的格式不匹配时. 当应用程序试图将图象的PixelFormat设为不支持的值 EInvalidGraphicOperation异常在满足下列条件之一时发生: 应用程序访问图象中不存在的扫描线时. 应用程序不能成功写入图象时. 应用程序在画布未处于有效状态时进行绘制. 应用程序装入未知或不支持的图象格式时. 应用程序将图象的PixelFormat设为不支持的值时不能分配该操作的句柄时. 字符串链表异常字符串链表异常是由于用户对字符串链表进行非法操作时引发的. 包括EStringListError,EListError等.由于许多部件都有一个Tstrings抽象类的属性(如Tiistbox组件的Items属性等,因而字符串链表异常在组件编程中很重要. EStringListError一般在字符串链表越界时产生.而EListError异常通常在以下情况下发生: 当索引项超出链表范围时当字符串链表的Duplicates属性设置为dupError 同时应用程序试图加入一个重复的字符串时. 当向已排序的字符串链表中插入字符串时. 组件异常类组件异常类用于响应组件异常,组件异常是由于对VCL组件进行操作时,违反了组件的使用规则及其特征而引发的,可分为两大类: 通用组件异常、专用组件异常、通用组件异常。