设为首页 加入收藏

TOP

Delphi高手突破(三) Delphi高级进阶(三)
2017-10-10 12:05:08 】 浏览:2040
Tags:Delphi 高手 突破 高级 进阶
}
 
procedure TForm1.SimulateError(Button : TObject);
begin
    if Button = Button1 then
        raise EFileNotFound.Create('File Not Found')
    else if Button = Button2 then
        raise EFileFormatErr.Create('File Format Error')
    else // Button = Button3
        raise Exception.Create('Unknonw Error');
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
    ToDo(Sender);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
    ToDo(Sender);
end;
 
procedure TForm1.ToDo(Button : TObject);
begin
    try
        SimulateError(Button)
    except
        on E : EFileOpenFailed do
            E.Warning();
        on E : Exception do
            ShowMessage(E.Message);
    end;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
var
    AStream : TMemoryStream;
begin
    AStream := TMemoryStream.Create();
 
    try
        SimulateError(Sender);
 
·56·

异常及错误处理
    finally
        AStream.Free();
    end;
end;
 
end.
  3
程序运行后,当单击界面上方的两个按钮之一时,都会调用 ToDo 方法。而在 ToDo
方法中,由于 SimulateError 被调用而引发一个异常,虽然并没有真的发生打开文件错误,
但确实抛出了异常。这再次说明了,异常只是用来标志错误,而并不等同于错误。
程序中,我们定义了一个标志打开文件失败的异常基类 EFileOpenFailed,以及两个派
生的异常类——EFileNotFound、EfileFormatErr。这样定义异常类框架,给错误处理部分带
来了更多的灵活性。这是多态性给我们的又一个恩惠。可以自由选择需要捕获的异常的“精
度”。也就是说,如果用户非常关心发生错误的具体原因,则可以捕获每个最底层的异常
类;而如果只关心是否发生了打开文件的错误,那么可以只捕获 EFileOpenFailed类;若关
心的只是是否有错误发生,则只需捕获 Exception 就行了。
在 SimulateError 的调用之外,设置了 try…except,那么它所引发的异常都会被捕获。
将“精度”更“细”的异常类的处理代码放在前面,而把“精度”较“粗”的异常类的处
理代码放在后面。如果相反,则所有异常都会被 Exception的处理代码捕获,而其他的异常
类的处理代码则永远都没有机会执行了。
Exception 程序演示了一个很小的、自定义的异常类框架的定义、实现及使用。“麻雀
虽小,五脏俱全”,它给出了一种在自己程序中错误的捕获、处理的思路。
3.3  try…finally
现在已经知道,在函数中引发异常将导致函数的正常返回,因此函数栈中的局部简单
对象(数组、记录等)会得到释放。同时也知道了,在 Object Pascal 中所有的类对象都在
堆中被构造,编译器不会在退出函数时自动调用它们的析构函数,那么如何保证所有的局
部类对象也能被释放呢?
Object Pascal引入了独特的 try...finally 来解决这个问题。
try…finally 块帮你保证一些重要的代码在无论是否发生异常的情况下都能被执行,这
些代码位于 finally和 end之间。
再次打开 Exception 程序,现在来看一下没用过的第 3 个按钮。为它的 Click 事件添加
如下的代码:
 
procedure TForm1.Button3Click(Sender: TObject);
var
  AStream : TMemoryStream;
 
·57·

Delphi  高手突破     
begin
  AStream := TMemoryStream.Create();
 
 try
   SimulateError(Self);
 finally
   AStream.Free();
 end;
end;
 
它首先创建了一个内存流对象,以模拟该函数申请了一些系统资源。然后还是调用
了 SimulateError 方法,不过这次 SimulateError 抛出的是一个 Exception 异常。但在此把
内存流对象的销毁工作放在了 finally 保护之中,由此保证该对象的释放。可以自己单步

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇[修正] Firemonkey TSelection 控.. 下一篇[修正] 移动平台曲线不平滑的问题..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目