不会有 Exception 产生的,但是这是一种用户定义的错误,因此在其后的 raise 语句中我们人为的产生一 个 Exception。这样的话当查询结果为空的时候,程序将跳到“on E: Exception do”处继续执行。 try 语句可以被嵌套。以下代码就是一种典型的应用: 代码 7:打开一个数据表,然后用游标的方式(不是 SQL 语句方式)添加一条记录。 var tbl: TTable; begin if tbl.Active then tbl.Close; try tbl.Open; tbl.Append; try
tbl.FieldByName('F1').AsString := sF1Value; tbl.FieldByName('F2').AsString := sF2Value; tbl.Post; except tbl.Cancel; raise; end; tbl.Close; except on E: Exception do begin if tbl.Active then tbl.Close; { 意外情况的处理 } end; end; end; 这段代码中当内层的 try 语句块肿是新增一条记录的处理,当新增一条记录的过程中,如果发生错误, 首先应 tbl.Cancel,但是这时候我们并不希望在这里完成我们所有的出错之后的处理,这时我们可以通过 一个单独的“raise”语句将 Exception 交给外层的 try 语句来处理。这里我们为了能够说明
问题,简化了 很多代码。在实际情况中可能将添加一条记录的处理封装成一个 procedure,在这个 procedure 中使用这 种写法可以使程序在出错的处理中也有好的封装性。 在使用 try 语句的时候,以下这种情况再 Delphi 中是不允许的,请看代码: 代码 8: try { 有关的处理代码 } except on E: Exception do begin { 处理代码 1 } try { 处理代码 2 } except end; { 处理代码 3 } end; end; 也就是说在出错处理中不可以再使用 try 语句块。但是如果将以上代码等价的转换为下列代码 Delphi 是允许的。 代码 9: procedure ExceptionProcess; begin try { 处理代码 2 }
except end; end; try { 有关的处理代码 } except on E: Exception do begin { 处理代码 1 } ExceptionProcess; { 处理代码 3 } end;