12.3 異常響應(yīng)
異常響應(yīng)為開發(fā)者提供了一個(gè)按自己的需要進(jìn)行異常處理的機(jī)制。try …except …end形成了一個(gè)異常響應(yīng)保護(hù)塊。與finally不同的是:正常情況下except 后面的語句并不被執(zhí)行,而當(dāng)異常發(fā)生時(shí)程序自動(dòng)跳到except,進(jìn)入異常響應(yīng)處理模塊。當(dāng)異常被響應(yīng)后異常類自動(dòng)清除。
下面的例子表示了文件打開、刪除過程中發(fā)生異常時(shí)的處理情況:
uses Dialogs;
var
F: Textfile;
begin
OpenDialog1.Title := 'Delete File';
if OpenDialog1.Execute then
begin
AssignFile(F, OpenDialog1.FileName);
try
Reset(F);
if MessageDlg('Erase ' +OpenDialog1.FileName + '?',
mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
System.CloseFile(F);
Erase(F);
end;
except
on EInOutError do
MessageDlg('File I/O error.', mtError, [mbOk], 0);
on EAccessDenied do
MessageDlg('File access denied.', mtError, [mbOk], 0);
end;
end;
end.
保留字on…do用于判斷異常類型。必須注意的是:except后面的語句必須包含在某一個(gè)on…do模塊中,而不能單獨(dú)存在。這又是同finally不同的一個(gè)地方。
12.3.1 使用異常實(shí)例
上面所使用的異常響應(yīng)方法可總結(jié)為如下的形式:
on ExceptionType do
{響應(yīng)某一類的異常}
這種方法唯一使用的信息是異常的類型。一般情況下這已能滿足我們的需要。但我們卻無法獲取異常實(shí)例中包含的信息,比如異常消息、錯(cuò)誤代碼等。假設(shè)我們需要對(duì)它們進(jìn)行處理,那么就必須使用異常實(shí)例。
為了使用異常實(shí)例,需要為特定響應(yīng)模塊提供一個(gè)臨時(shí)變量來保存它:
on EInstance : ExceptionType do …
在當(dāng)前響應(yīng)模塊中我們可以象使用一個(gè)普通對(duì)象那樣來引用它的數(shù)據(jù)成員。但在當(dāng)前響應(yīng)模塊之外不被承認(rèn)。
下面的代碼用于獲取異常消息并按自己的方式顯示它:
{窗口中包括一個(gè)ScrollBar部件,一個(gè)Button部件}
procedure TErrorForm.Button1Click(Sender: TObject);
begin
try
ScrollBar1.Max := ScrollBar1.Min-1;
except
on E: EInvalidOperation do
MessageDlg('Ignoring Exception:'+E.Message,
mtInformation,[mbOK],0);
end;
end;
12.3.2 提供缺省響應(yīng)
在異常響應(yīng)模塊中,一般我們只對(duì)希望響應(yīng)的特定異常進(jìn)行處理。如果一個(gè)異常發(fā)生而響應(yīng)模塊并沒有包含對(duì)它的處理代碼,則退出當(dāng)前響應(yīng)模塊,異常類仍被保留。
為了保證任何異常發(fā)生后都能在當(dāng)前響應(yīng)模塊中被清除,可以定義缺省響應(yīng):
try
{程序正常功能}
except
on ESomething do
{響應(yīng)特定異常}
else
{提供缺省響應(yīng)}
end;
由于else可以響應(yīng)任何異常,包括我們一無所知的異常,因此在缺省響應(yīng)中最好只包括諸如顯示一個(gè)消息框之類的處理,而不要改變程序的運(yùn)行狀態(tài)或數(shù)據(jù)。
相關(guān)推薦:2010年9月計(jì)算機(jī)等級(jí)考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |