try……except,try……finaly等,请高手给讲讲
解决方案 »
- report machine主从表 从表数据分组问题 求救
- 多个apf文件如何合并成一个APF文件,且还能分页显示
- dbase数据库如何进行加密码???
- 窗口中的有个特殊的控键,怎么bm_click一下—急—大虾帮帮我
- 请问如何保存和创建数据库?
- 我用了XPMenu控件,但是标题栏和Form还是原来那样,要怎么样就可以做得比较好看呢?
- 有两个sqlsever库,库中有很多表,如何把一个库追加到另一个库中呢???急!!
- 仓库台帐!!!!!!!
- 程序员的乐园在哪里?
- 大虾们,不要见死不救呀,拉兄弟一把吧!(关于richedit的问题)一定给分!
- excel输出,不同列要同时在一个表中输出的问题。
- 怎么样把一个dbgrid的内容保存到另外一个一个数据表内
在 try ... finaly 语句中的代码若运行时产生异常, 则弹出错误信息.
不管是否有异常都会执行 finaly ... end; 中的代码, 而 except ... end 代码只会产生异常时才执行.
写法一:try
语句1;
except
语句2;
end;
语句3;1、如果语句1没有出现异常,则接着运行语句3;
2、如果语句1出现异常,则进入语句2进行判断;如果语句2中有对这一异常的响应,响应后接着运行语句3,如果没有对这一异常的响应则立即退出当前过程,向上一层继续抛出该异常,不会执行语句3;
如语句2写成了
on ExceptionType do ...;(...可以为空,即不写任何语句)
则发生了ExceptionType异常(注:Exceptiontype代表某一具体异常如ERangeError)就会执行语句3,其他异常就会立即退出而不会执行语句3;
如果语句2对所有异常进行响应则都会接着执行语句3。语句2对所有异常响应有以下写法:
(1)、不用on Exceptiontype do语句,也可一句都不写为空;
(2)、on Exception do ...; {...语句可写可不写};
(3)、on ExceptionType do...else ...;{...语句可写可不写};
(4)、on exceptiontype1 do...;
on exceptiontype2 do...;
on Exception do...;{以上...语句都可写可不写};
///////////////////////////////////////////////////
写法二:try
语句1;
Finally
语句2;
end;
语句3;不论语句1是否出现异常,语句2都会执行,但语句3在出现异常后不会执行
///////////////////////////////////////////////////
写法三:try
try
语句1;
exception
语句2;
end
Finally
语句3;
end;
语句4;
1、如果语句1未出现异常,则会执行语句3接着执行语句4;
2、如果语句1出现异常,则进入语句2进行判断,如果对这一异常进行了响应则会执行语句3接着执行语句4;
如果对这一异常未响应则会执行语句3后退出当前过程,语句4不会执行;
如果语句2对所有异常进行了响应(见例1)则会执行语句3接着执行语句4;///////////////////////////////////////////////////
写法四:try
try
语句1;
Finally
语句2;
end
Except
语句3;
end;
语句4;1、如果语句1未出现异常;则执行语句2,接着执行语句4;
2、如果语句1出现异常,则会先执行语句2,接着进入语句3进行判断,如果对这一异常进行了响应则会执行语句4,如果对这一异常未响应则会立即退出当前过程,不会执行语句4;
try
{写你的代码}
except
{什么也不写}
;try……except,try……finaly最大的区别是:try……except出错后还会继续执行未执行完的代码,而try……finaly将会直接跳出当过未执行完的代码。
//申请
//......
finally
//释放
end;
//申请
except
{什么也不写}
;
//这里也可以释放正如delphi2java(delphi2java) 所说的
try……except,try……finaly最大的区别是:
try……except出错后还会继续执行未执行完的代码,而try……finaly将会直接跳出当过未执行完的代码。一般而言,程序出错后你总是希望将错误纠正以后让程序继续执行,所以用try...execpt足够了。
except段中是用来写自己处理错误代码的,即使不处理也要抛出异常到外部,让外部保护语句或WINDOWS来处理。
try
inifile1 := Tinifile.create('path+name');
inifile1.…… ---------------------------->如果这里出错方案1、except
inifile1.free;
end;
inifile1.free;方案2、finally
inifile1.free;
end;结果选择方案2,理由:方案一必须重复释放 inifile1,出错的几率大增;
方案二保证不出错!
inifile1.free;//谁说要这一句呀?这里为空,什么都不写。
end;
inifile1.free;
inifile1 := TInifile.Create(AFileName);
try
// ... ...
// 如果这里出错
// ... ...
except
end;
inifile1.Free;写法二:
inifile1 := TInifile.Create(AFileName);
try
// ... ...
// 如果这里出错
// ... ...
finally
inifile1.Free;
end;相同是:
写法一与写法二都能释放对象区别是:
1. 写法一不会弹出异常信息, 而写法二会弹出异常信息;
2. 写法二比写法一运行代码要多, 效率没有写法一来得高.
var
StrLst: TStringList;
begin
StrLst := TStringList.Create;
try
try
StrLst.LoadFromFile('C:\Text.txt');
except
ShowMessage('读取文件异常,可能是文件不存在!'); // 如果出错;
end;
finally
StrLst.Free; // 总是执行;
end;
end;// 不申请内存时:
procedure TForm1.Button2Click(Sender: TObject);
begin
try
Memo1.Lines.LoadFromFile('C:\Text.txt');
except
ShowMessage('读取文件异常,可能是文件不存在!'); // 如果出错;
end;
end;
// 执行相应的操作
except on e:exception do
//出现错误,显示错误信息
showmessage(e.message) ;finally
//一定要执行的部分,不管是否有错误发生!
function TADM.GetconnString:WideString;
var MyFile:TIniFile;
FileName:string;
begin
FileName:=ExtractFilePath(Application.ExeName)+'sconfig.ini';
MyFile:=TiniFile.Create(filename);
try
try
Result:='Provider='+MyFile.ReadString('DataBase','Provider','SQLOLEDB.1;');
Result:=Result+'Persist Security Info='+MyFile.ReadString('DataBase','Persist Security Info','False;');
Result:=Result+'User ID='+MyFile.ReadString('DataBase','User ID','sa;');
Result:=Result+'Initial Catalog='+MyFile.ReadString('DataBase','Initial Catalog','SalaryII;');
Result:=Result+'Data Source='+MyFile.ReadString('DataBase','Data Source','127.0.0.1;');
finally
MyFile.Free;
end;
except
Application.MessageBox(Msg_ini_readerror,Msg_title_error,mb_ok+mb_iconerror);
end;
end;
1.在except子句中可以对异常类型进行判断,采取不同的异常处理。如,
iZero := 0;
try
iValue := 5 div iZero;
except
on EIntOverflow do begin
iValue := 0;
end;
on EIntError do begin
iValue := 0;
end;
on EDivByZero do begin
iValue := 0;
end;
end;
但要注意,如果有多个异常接管块,且其中的异常有继承关系,超类的异常接管块应该放在子类异常接管块后面,否则子类异常接管块永远执行不到。比如上个例子中,EDivByZero异常接管不到,因为其父类EIntError先接管掉了。
2.异常接管之后,如果我们无能为力处理这个异常,我们可以重新把这个异常抛出,甚至抛出另外类型异常。用raise关键字。
3.kyee(浪子阿鹏) 关于对象释放的两种写法评价中,我有一些异议。
1)首先我认为写法一是代码很危险的。除非你把所有异常接管掉,然后进行空处理。一旦有异常接管处理之后,就有可能会抛出新的异常(而且很多处理接管处理之后,会重新抛出异常,调用raise)。这个时候,紧接着的对象释放语句就得不到执行。自然就有错了。
2) 是否会弹出异常,我们可以用TApplication的OnException事件来统一处理,是否要显示异常出错信息,不应该在业务处理的这个时候来决定。至于调试期间是否要弹出异常,可以在Delphi环境(Tools | Debug Options)中设置