Delphi异常处理tryexcept语句和try
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)
try与except用法 -回复
try与except用法-回复try与except是Python编程语言中的异常处理机制,用于处理代码执行过程中可能出现的错误或异常情况。
在编写程序时,无法预测所有可能出现的错误,但是通过使用try与except语句,可以捕获并处理这些异常,保证程序的健壮性和稳定性。
本文将详细介绍try与except的用法和原理,以及如何正确地使用它们来处理异常情况。
一、try和except的基本用法1.1 try语句块:在代码中使用try语句块可以标识出可能发生异常的代码片段。
try语句块的基本语法如下:try:# 可能发生异常的代码...1.2 except语句块:在try语句块后面可以使用一个或多个except语句块来捕获和处理各类异常情况。
except语句块的基本语法如下:except [异常类型]:# 异常处理代码...当try语句块中的代码执行过程中发生异常时,程序会跳到对应的except 语句块中执行异常处理代码,而不会中断程序的运行。
使用except语句时,可以指定捕获的异常类型,也可以不指定任何异常类型,以捕获所有异常情况。
二、捕获指定异常类型2.1 捕获指定异常类型的基本语法:except 异常类型[as 别名]:# 异常处理代码...当try语句块中发生指定类型的异常时,程序会跳转到对应的except语句块中执行异常处理代码。
在except语句块中,可以使用as关键字给异常类型指定一个别名,以便在异常处理代码中引用该异常对象的详细信息。
2.2 捕获多个异常类型:除了捕获单个异常类型外,还可以捕获多个异常类型,可以将多个异常类型放在一个except语句块中,用逗号分隔。
当try语句块中发生任意一个指定的异常类型时,程序会跳到对应的except语句块中执行异常处理代码。
例如:except (异常类型1, 异常类型2, ...):# 异常处理代码...2.3 捕获所有异常情况:如果不指定任何异常类型,可以捕获所有可能的异常情况。
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;。
第6章Delphi程序异常处理与调试技术.
第六章程序异常处理与调试技术在Delphi中有两种程序错误,一种是编译错误,在程序编辑阶段就可以由编译器发现并给出提示。
另外一种是运行错误,这类错误不能在编译阶段查出,只能在程序执行时发现,称为运行错误。
Delphi提供了一种机制来处理运行错误,保护程序的正常执行,这种机制就是异常处理。
异常处理的方法是把正常的执行程序同错误的处理程序分离开来,这样可以保证在没有错误时,程序正常执行,当发生错误时,执行错误处理部分的程序,然后程序跳出保护模块,继续执行后续的程序。
6.1 Object Pascal异常的种类异常的种类:Delphi内建的异常类,程序员自定义的异常类。
异常基类及其属性和主要方法:在Delphi中,所有异常的基类是Exception 类。
所有其他异常类都是由该类派生而来。
1. exception属性该类有两个基本属性:HelpContext和Message。
(1)Exception.HelpContext属性该属性的定义如下:▪Type ThelpContext= -MaxLongint..MaxLongint;▪Property HelpContext:ThelpContext;HelpContext是ThelpContext类的一个实例,它提供了与异常对象联系在一起的上下文相关帮助信息的序列号。
该序列号决定当发生异常时用户按F1键显示的一个异常错误的帮助信息。
(2)Exception.Message属性该属性的定义如下:property Message: string该属性存储异常发生时的错误信息。
可以通过该属性在提示错误对话框中显示错误信息字符串。
2.exception方法(1)Exception.Create方法该方法的定义形式为:Constructor Create(Const Msg: String);该方法用来产生一个带有一条简单提示信息的对话框,对话框中的提示内容由Msg提供(2)Exception.CreateFmt方法该方法的定义格式如下:Constructor CreateFmt(Const Msg:String;Const Args:Array of Const) ;该方法用来产生一个带有格式化字符串提示信息的对话框,格式化的字符串由Msg和Args数组共同提供,其中数组Args负责提供用于格式化的数值。
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()的用法的深度和广度兼具的探讨,希望对你有所帮助。
try expect的用法
try expect的用法try expect是一种错误处理的机制,在编程中常用于捕获异常并进行相应的处理。
它的基本语法结构为try-except,其中try语句块用于包含可能发生异常的代码,而except语句块用于处理捕获的异常。
在try语句块内,我们可以放置可能引发异常的代码,一旦发生异常就会跳出try语句块并进入与之匹配的except语句块。
在except 语句块中,我们可以指定要处理的异常类型,如果捕获的异常类型与except语句中的类型匹配,则执行相应的代码块,否则将异常继续抛出。
以下是一个示例,展示了try-except的基本使用:```try:#尝试执行可能引发异常的代码result = 10 / 0 #这里会引发一个ZeroDivisionError异常except ZeroDivisionError:#处理捕获的ZeroDivisionError异常print("除数不能为0!")```在上述示例中,我们在try语句块中尝试执行一个除法运算,但是除数为0,会引发一个ZeroDivisionError异常。
在except语句块中,我们指定要处理的异常类型为ZeroDivisionError,当捕获到这个异常时,会执行相应的代码块,输出"除数不能为0!"。
除了可以指定特定的异常类型进行处理外,还可以使用一个通用的except语句块来捕获所有异常。
示例如下:```try:#尝试执行可能引发异常的代码result = value / 0except:#处理所有捕获的异常print("发生了一个异常!")```在这种情况下,无论发生什么类型的异常,都会被捕获并执行except语句块中的代码。
除了except语句块外,我们还可以添加else和finally语句块来扩展try-except的用法。
else语句块在try语句块中的代码未引发任何异常时执行,而finally语句块无论是否引发异常都会执行。
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异常处理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复选框的勾选状态可以进行异常的调试。
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语句。
本人在过去得编程过程中,深刻地体会到,这两个语句的合理使用,可以带来很多好处。
一方面可以使程序结构更加清晰,使得我们不用编写大量的意外情况处理的代码;另一方面使我们可以很容易的编写出十分稳定可靠的程序。
一、我们为什么要使用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的打开和关闭……。
如果程序中不能很好的处理这些语句,就导致许多不可预测的现象。
请参考如下代码:代码3:显示一个“关于……”对话框。
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块,可以处理不同类型的异常,并提供相应的处理和恢复机制,以确保程序的正常运行。
try与except用法
try与except用法标题:理解Python中try与except的用法:错误处理的利器导语:在Python的异常处理中,try与except是至关重要的工具。
本文将深入探讨try与except的用法,从基础概念到高级应用,帮助读者全面掌握错误处理的利器。
第一部分:引言与基本概念(200字)异常是编程中经常会遇到的问题,而错误处理是一项必不可少的技能。
在Python中,try与except是异常处理的关键字。
try语句块用于包括可能出现错误的代码,而except语句块用于定义处理相应异常的逻辑。
通过合理使用try与except,我们能够在出现错误时优雅地处理异常,避免程序崩溃。
第二部分:try与except的基本用法(300字)try与except的基本语法如下所示:try:可能会出现异常的代码块except 异常类型:异常处理逻辑无论try块中的代码是否出现异常,程序都会执行try块中的代码。
如果出现异常,那么会根据异常类型决定执行哪个except块中的代码。
如果没有指定异常类型,那么可以捕获任意异常。
以下是一个简单的例子,来说明try与except的基本用法:try:num = 10 / 0print("这行代码不会被执行")except ZeroDivisionError:print("除零错误发生了")在上面的代码中,由于除数为0,程序会抛出ZeroDivisionError异常。
try块中的代码执行到出现异常的那一行时就会停止执行,然后转到对应的except块中进行异常处理。
第三部分:多个except语句的使用(400字)我们还可以使用多个except语句来处理不同类型的异常。
例如:try:# 某些可能会出现异常的代码except TypeError:# 处理类型错误的逻辑except ValueError:# 处理数值错误的逻辑except Exception:# 处理其他类型的异常在上述代码中,我们定义了三个不同类型的异常处理块。
文件异常处理使用的语句
文件异常处理使用的语句在处理文件异常时,可以使用以下语句:1. try-except语句:用来捕获可能出现的异常并进行处理。
```pythontry:# 打开文件或进行其他可能引发异常的操作file = open("filename.txt", "r")# 其他操作except FileNotFoundError:# 处理文件不存在的异常print("文件不存在")except IOError:# 处理文件IO错误的异常print("文件读取错误")except Exception as e:# 处理其他异常print("其他异常:", str(e))finally:# 无论是否发生异常,都会执行的代码块file.close()```2. with语句:用于打开文件,在文件操作完成后会自动关闭文件,无需手动关闭。
```pythontry:with open("filename.txt", "r") as file:# 文件操作except FileNotFoundError:print("文件不存在")except IOError:print("文件读取错误")except Exception as e:print("其他异常:", str(e))```3. raise语句:用于手动抛出异常。
```pythontry:if file is None:raise ValueError("文件为空")except ValueError as e:print("发生了值错误:", str(e))```注意:以上只是一些常见的文件异常处理语句,具体使用时需要根据实际情况进行适当调整。
try....except....详细用法
try....except....详细⽤法# 1.异常只能⽤来处理指定的异常取代,如果⾮指定异常则⽆法处理# 2多分⽀:被监测的代码块抛出的异常有多种可能性,并且我们需要针对每⼀种异常类型都定制专门的处理逻辑try:print('========>1')# nameprint('==========>2')l = [1, 2, 3]# l[100]print('==========>3')d={ }d['name']print('=============>4')except NameError as e:print('----------->', e)print(1)except IndexError as e:print('----------->', e)print(2)except KeyError as e:print('----------->', e)print(3)print('执⾏接下去的代码')'''如果遇到 NameError 执⾏结果:========>1-----------> name 'name' is not defined####执⾏完跳到 print('执⾏接下去的代码')''''''如果遇到 IndexError 执⾏结果:========>1==========>2-----------> list index out of range####执⾏完跳到 print('执⾏接下去的代码')''''''如果遇到 KeyError 执⾏结果:========>1==========>2==========>3-----------> 'name'####执⾏完跳到 print('执⾏接下去的代码')'''# 万能异常:Exception ,被监测的代码块抛出的异常有多种可能性,# 并且我们针对所有的异常类型都只⽤⼀种处理逻辑就可以了,那就使⽤Exceptiontry:print('========>1')nameprint('==========>2')l = [1, 2, 3]l[100]print('==========>3')d={ }d['name']print('=============>4')except Exception as e :print('------------>', e)print('执⾏接下去的代码')# 其他结构:try:print('========>1')nameprint('==========>2')l = [1, 2, 3]# l[100]print('==========>3')d={ }d['name']print('=============>4')except NameError as e:print('----------->', e)print(1)except IndexError as e:print('----------->', e)print(2)except KeyError as e:print('----------->', e)print(3)except Exception as e:print('统⼀的处理⽅法',333)else:print('在被监测的代码块没有发⽣异常时执⾏') finally:print('不管被监测的代码块有⽆发⽣异常都会执⾏') print('执⾏接下去的代码')# 主动触发异常:raise 异常类型(值)class People:def __init__(self,name,age):if not isinstance(name,str):raise TypeError('name传⼊必需是字符串类型')if not isinstance(age,int):raise TypeError('age 传⼊必需是int类型')=nameself.age=agep = People('kingfor',18)# ⾃定义异常类型:class MyException(BaseException):def __init__(self,msg):super(MyException,self).__init__()self.msg = msgdef __str__(self):return '<%s>' % self.msgraise MyException('我⾃定义异常处理类型')# 断⾔assertinfo = {}info['name'] = 'kingforn'info['age'] = 18# if 'name' not in info:# raise KeyError('必须有name这个key')# if 'age' not in info:# raise KeyError('必须有name这个key')assert ('name' in info) and ('age' in info)if info['name'] == 'kingforn' and info['age'] >10:print('welcome')。
python中try...except的用法
在Python 中,try-except是用于异常处理的语句结构,它允许编写代码来捕获和处理程序运行时可能发生的异常情况,以确保程序能够在出现问题时合理地处理它们而不会崩溃。
下面是try-except的基本用法:pythontry:# 可能会抛出异常的代码passexcept as:# 异常处理代码print(f"发生了异常:{}")其中,try后面的代码块是可能会抛出异常的代码,except后面的代码块是用于处理异常的代码。
如果try代码块中的代码出现了异常,Python 将会跳过后面的代码,直接执行except后面的代码。
Exception是一个通用的异常类型,可以捕获所有类型的异常。
在实际使用中,通常会根据具体的情况捕获特定类型的异常,并进行相应的处理。
例如:pythontry:# 可能会抛出异常的代码passexcept as:# 处理 ValueError 异常的代码print(f"发生了值错误:{}")except as:# 处理其他类型异常的代码print(f"发生了其他异常:{}")在上面的例子中,try代码块中可能会抛出ValueError异常,因此使用except ValueError as e来捕获这个异常,并进行相应的处理。
如果抛出的异常不是ValueError,则会执行except Exception as e后面的代码。
此外,还可以使用else子句在没有发生异常时执行一些代码:pythontry:# 可能会抛出异常的代码passexcept as:# 异常处理代码print(f"发生了异常:{}")else:# 没有发生异常时执行的代码print("没有发生异常")如果try代码块中的代码没有抛出异常,则会执行else后面的代码。
try-except语句可以有效地提高程序的健壮性,使程序能够在出现异常时不会崩溃,而是能够合理地处理它们。
Delphi异常处理tryexcept语句和try
Delphi异常处理try except语句和try finally语句用法以及区别一、异常的来源在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语句来实现。
(3)在try…except…end中更加精确的捕捉异常。
使用on E:异常类do…结构可以在do体内处理特定异常类所抛出的异常。
四、异常的调试在Delphi IDE中,解除“Debugger Options”(可以使用菜单Tools—>Debugger Opt ions…进行访问)中的Integrated Debugging复选框的勾选状态可以进行异常的调试。
(Python)异常处理try...except、raise
(Python)异常处理try...except、raise⼀、try...except有时候我们写程序的时候,会出现⼀些错误或异常,导致程序终⽌。
例如,做除法时,除数为0,会引起⼀个ZeroDivisionError例⼦:a=10b=0c=a/bprint "done"运⾏结果:Traceback (most recent call last):File "C:/Users/lirong/PycharmProjects/untitled/openfile.py", line 3, in <module>c=a/bZeroDivisionError: integer division or modulo by zero我们发现程序因为ZeroDivisionError⽽中断了,语句print "done" 没有运⾏。
为了处理异常,我们使⽤try...except,更改代码:a=10b=0try:c=a/bprint cexcept ZeroDivisionError,e:print e.messageprint "done"运⾏结果:integer division or modulo by zerodone这样程序就不会因为异常⽽中断,从⽽print "done"语句正常执⾏。
我们把可能发⽣错误的语句放在try模块⾥,⽤except来处理异常。
except可以处理⼀个专门的异常,也可以处理⼀组圆括号中的异常,如果except后没有指定异常,则默认处理所有的异常。
每⼀个try,都必须⾄少有⼀个except处理⼀组异常可以这样写(其中e代表异常的实例):try:passexcept (IOError ,ZeroDivisionError),e:print etry ....except...else 语句,当没有异常发⽣时,else中的语句将会被执⾏。
try except语句
try except语句x一、什么是try except语句try except语句是Python的一种异常处理机制,它使用一个try 块来捕获异常,当try块内发生异常时,执行except块,用于处理异常。
二、try except语句的基本语法try:#可能产生异常的语句except [Exception [,reason]]:#异常处理语句三、try except语句的几种用法1、处理简单的异常try:a = 1/0except ZeroDivisionError:print('除数不能为0')2、捕获所有异常常用于调试代码,可以捕获所有的异常,以便更快地定位到发生异常的地方try:a = 1/0except:print('发生了异常')3、多个except条件try:a = 1/0except ZeroDivisionError:print('除数不能为0')except TypeError:print('类型错误')4、多个except条件带elsetry:a = 2/2except ZeroDivisionError:print('除数不能为0')except TypeError:print('类型错误')else:print('正常执行')5、多个except条件带finally try:a = 1/2except ZeroDivisionError:print('除数不能为0')except TypeError:print('类型错误')else:print('正常执行')finally:print('无论结果如何,都会执行')四、try except语句的注意事项1、异常处理代码块的顺序需要正确,最具体的异常应该在最前面,最通用的异常应该在最后。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Delphi异常处理try except语句和try finally语句用法以及区别一、异常的来源在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语句来实现。
(3)在try…except…end中更加精确的捕捉异常。
使用on E:异常类do…结构可以在do体内处理特定异常类所抛出的异常。
四、异常的调试在Delphi IDE中,解除“Debugger Options”(可以使用菜单Tools—>Debugger Opt ions…进行访问)中的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异常处理机制例;tryAge := StrToInt(Edit1.Text);ShowMessage(Format('生于%d年', [YearOf(Now) - Age]));excepton EConvertError doshowmessage('输入编辑框的不是一个有效的数字!');on ERangeError doshowmessage('输入编辑框的年龄值太大!');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(‘我抛出的异常!’);例:tryraise Exception.Create('我抛出的异常!');excepton E: Exception doshowmessage('异常类名称:' + 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组件进行操作时,违反了组件的使用规则及其特征而引发的,可分为两大类:通用组件异常、专用组件异常、通用组件异常。