12.2.1 需要保護的資源
一般說來需要保護的資源包括:
● 文件
● 內(nèi)存
● Windows資源
● 對象
比如下面一段程序就會造成1K內(nèi)存資源的丟失。
var
APointer : Pointer ;
AInt , ADiv: Integer ;
begin
ADiv := 0;
GetMem ( APointer , 1024 );
AInt := 10 div ADiv ;
FreeMem ( Apointer , 1024 );
end;
由于程序從異常發(fā)生點退出從而FreeMem永遠沒有執(zhí)行的機會。
12.2.2 產(chǎn)生一個資源保護塊
Delphi提供了一個保留字finally,用于實現(xiàn)資源的保護:
{分配資源}
try
{資源使用情況}
finally
{釋放資源}
end;
try…finally…end就形成了一個資源保護塊。finally后面的語句是在任何情況下,不論程序是否發(fā)生異常,都會執(zhí)行的。
對于(12.2.1)中的例子如下代碼即可確保所分配內(nèi)存資源的釋放:
var
APointer : Pointer ;
AInt , ADiv : Integer;
begin
ADiv := 0;
GetMem ( APointer , 1024 );
try
AInt := 10 div ADiv ;
finally
FreeMem ( Apointer , 1024 );
end;
end;
下面的例子摘自(6.4)節(jié),是在文件拷貝中實現(xiàn)文件資源的保護:
procedure CopyFile(const FileName, DestName: TFileName);
var
CopyBuffer: Pointer;
TimeStamp, BytesCopied: Longint;
Source, Dest: Integer;
Destination: TFileName;
const
ChunkSize: Longint = 8192;
begin
Destination := ExpandFileName(DestName);
if HasAttr(Destination, faDirectory) then
Destination := Destination + '\' + ExtractFileName(FileName);
TimeStamp := FileAge(FileName);
GetMem(CopyBuffer, ChunkSize);
try
Source := FileOpen(FileName, fmShareDenyWrite);
if Source < 0 then
raise EFOpenError.Create(FmtLoadStr(SFOpenError, [FileName]));
try
Dest := FileCreate(Destination);
if Dest < 0 then
raise EFCreateError.Create(FmtLoadStr(SFCreateError, [Destination]));
try
repeat
BytesCopied := FileRead(Source, CopyBuffer^, ChunkSize);
if BytesCopied > 0 then
FileWrite(Dest, CopyBuffer^, BytesCopied);
until BytesCopied < ChunkSize;
finally
FileClose(Dest);
end;
finally
FileClose(Source);
end;
finally
FreeMem(CopyBuffer, ChunkSize);
end;
end;
程序的具體解釋見 (6.4)節(jié)。
在異常保護的情況下,當異常發(fā)生時,系統(tǒng)會自動彈出一個消息框用于顯示異常的消息。退出當前模塊后異常類自動清除。
相關推薦:2010年9月計算機等級考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |