Delphi中的异常处理(异常来源、处理、精确处理)

一.异常的来源                   

  在Delphi应用程序中,下列的情况都比较有可能产生异常。

  1.文件处理

  2.内存分配

  3.windows资源

  4.运行时创建对象和窗体

  5.硬件和操作系统冲突

  6.网络问题

  7.数据库

  8.控件中的异常

  9.DLL文件的异常

  10.强制类型转换

  …………

二.异常的处理                   

  1.try...except...end;

    在try 体内的代码发生异常时,系统将转向except 部分进行异常的处理。这是Delphi处理异常的最基本的方式之一。

    只有当try 体内的代码发生异常时,才会跳转到except 里面的代码进行执行

  2.try...finally...end;

    这种异常处理结构一般用于保护windows的资源分配等方面,它确保了无论try 体内的代码是否发生异常,都需要由系统进行最后的统一处理的一些Windows对象的正确处理

    和try...except...ebd不同,该结构的finally部分总被执行

  3.不存在try...except...finally...end 结构来既处理异常,又保护资源分配的结构,但是,try...except...end结构允许嵌套到try...finally...end结构中,从而既处理异常,又保护资源的分配

三.异常的精确处理                 

1.定义一个异常

  在Delphi中,每个异常都是Exception类的一个派生类。因此,定义一个异常就是定义一个Exception类的派生类


1

2

type

    EMyException = class(Exception);

  当然,基类可以是Exception或者是Exception的任何一个任何层次的派生类

2.在程序中抛出一个异常

  根据不同的情况抛出异常是使用异常的最基本的模式。在Delphi中,由raise语句来实现

raise 异常类.Create(‘异常信息说明‘);

  注意因为使用了 异常类.Create(‘异常信息说明‘); 所以也就是在内存中创建了一个异常实体。


1

2

3

begin

  raise Exception.Create(‘抛出异常‘);

end;


1

2

3

4

//例2:

begin

  raise Exception.CreateFmt(‘%s %d‘, [‘错误代码:‘999]);

end;

  


1

2

3

4

5

6

7

//例3:

var

  exc: Exception;

begin

  exc := Exception.Create(‘发现异常‘);

  raise exc;

end;

  

或者直接使用:raise;  

  看一个代码示例


1

2

3

4

5

6

7

8

9

var

    iTest: Integer;

    iStr: string;

...

try

    iTest:= StrIntTo(iStr);

except

    raise Exception.Create(‘抛出异常‘);

end;

  上面的代码可能会抛出异常,假如这是一个函数,那么在编程时候如果调用了这个函数的话不要忘记了要捕捉这个异常!

建议用法

  建议使用raise 异常类.Create(‘异常信息说明‘);这样的方式,以及另外两个相似的语法方式,因为这样可以在抛出异常的时候尽可能详细的说明异常的情况,那么以后在捕捉异常的时候就可以又比较多的信息来让我们了解到异常出现的地方,如果直接使用raise;的话

  在except中使用raise 的时候,执行完raise的代码之后,在except中的且在raise后的代码将不会执行,它会在执行完raise 的代码后直接跳出except,例程


1

2

3

4

5

6

7

8

9

10

var

    iTest: Integer;

    iStr: string;

...

try

    iTest:= StrIntTo(iStr);

except

    raise;

    ShowMessage(‘不会显示‘);

end;

  这个代码例子,如果出现异常之后,会进入except,执行完 raise之后将不会执行ShowMessage的语句,而是直接跳出,所以在编程的时候一定要注意!!

  如果想要在except中执行的代码,一定要放在raise的前面!!

3.在try...except...end中更加精确的捕捉异常

  可以使用 on E:异常类 do... 结构可以在 do 体内处理特定异常类所抛出的异常。

  如果在except中使用 on E: 异常类 do... 的话,在except中的 on E: 异常类 do...之外不能有任何语句,例如下面的语法是正确的


1

2

3

4

5

6

7

8

9

try

    ...

except

    on E: Exception do

    begin

        ShowMessage(‘OK‘);

        ShowMessage(‘OK Again‘);

    end;

end;

  但是下面的方式就错了


1

2

3

4

5

6

7

8

9

try

    ...

except

    on E: Exception do

    begin

        ShowMessage(‘OK‘);

    end;

        ShowMessage(‘Not OK‘);    //如果在except中使用 on E: 异常类 do 的话,在except中的 on E: 异常类 do之外不能有任何语句

end;

  

四.常见应用场景下的异常处理            

  异常信息的处理方法(写日志、抛出异常),函数或过程出现异常时,只能抛出异常,禁止弹出对话框架。

  函数及过程、控件中发生异常,通常是直接抛出异常,不要显示信息提示框;

  界面操作(按钮)中的异常,可以显示提示信息(视具体应用而定),也可以不显示提示而将异常信息保存到日志文件或两种方式同时使用;

  DLL文件中的异常:如果是函数或过程,发生异常时就直接抛出异常;如果是界面操作,则按界面操作(按钮)中的异常处理方法处理。

五.异常的调试                   

1.如何设置才能进行异常调试

  在Delphi IDE中,解除“Debugger Options”(可以使用菜单Tools->Debugger Options->OS Exception...进行访问)中的Integrated Debugging复选框的勾选状态可以进行异常的调试。

2.怎么能按照自己的异常处理来处理而不是报系统信息

  另外还有一个可能会遇到的困惑:为什么明明自己在代码中捕捉了异常并且进行了异常处理,但是最后显示的还是系统的报错框而不是我自己的处理效果。

  解决方法:需要在Tools-> Debugger Options-> Language Exceptions 配置界面上的 Stop on Delphi Exceptions选项解除勾选,就会是按照自己的异常处理逻辑处理,而不是系统的报错。

六.异常的补充说明                 

  1.每一段程序都有可能出错!这是软件业的一个不容置疑的现象和规律。事实上,传统的 if...else...结构完全可以解决所有的错误,使用 Exception 机制也没能够回避在最原始的层次,通过遍历可能的情况来产生异常的做法,那么,为什么还需要异常机制

    答案很简单:异常提供了一种更加灵活和开放的方式,使得后来的编程者可以来根据实际的情况处理这种错误,而不是使用预先设定好的处理结果。实际上,这就是异常处理机制的核心

http://www.cnblogs.com/xumenger/p/4359271.html

时间: 2024-08-05 04:08:43

Delphi中的异常处理(异常来源、处理、精确处理)的相关文章

Delphi中的异常处理(10种异常来源、处理、精确处理)

一.异常的来源 在Delphi应用程序中,下列的情况都比较有可能产生异常. 1.文件处理 2.内存分配 3.windows资源 4.运行时创建对象和窗体 5.硬件和操作系统冲突 6.网络问题 7.数据库 8.控件中的异常 9.DLL文件的异常 10.强制类型转换 ………… 二.异常的处理 1.try...except...end; 在try 体内的代码发生异常时,系统将转向except 部分进行异常的处理.这是Delphi处理异常的最基本的方式之一. 只有当try 体内的代码发生异常时,才会跳转

T-SQL编程中的异常处理-异常捕获(try catch)与抛出异常(throw)

原文:T-SQL编程中的异常处理-异常捕获(try catch)与抛出异常(throw) 本文出处: http://www.cnblogs.com/wy123/p/6743515.html T-SQL编程与应用程序一样,都有异常处理机制,比如异常的捕获与异常的抛出(try catch throw),本文简单介绍异常捕获与异常抛出在T-SQL编程中的实际使用 . 异常处理简单说明 异常捕获在应用程序编程中非常常见,提供了处理程序运行时出现的任何意外或异常情况的方法刚毕业的时候对于异常处理迷茫不解,

Delphi中的异常处理

转载:http://www.cnblogs.com/doit8791/archive/2012/05/08/2489471.html 以前写Delphi程序一直不注意异常处理,对其异常处理的机制总是一知半解,昨天程序中的一个bug ,让我对异常有了更深入的认识,必须要对可能产生异常的地方进行异常处理,否则可能给程序造成灾难. 就像昨天,因为写的 filecopy 函数没有做异常捕获处理,导致复制文件出错时整个程序崩溃,用户只能通过杀进程的方式重启程序再进行其他操作.后来对程序进行了异常处理,遇到

Delphi中BCD和Currency类型

用了这些年的Delphi,竟然对Currency及TBCDField一知半解,下文给了很好的讲解,值得一读. 一.       BCD类型 BCD即Binary-Coded Decimal?,在Delphi中,BCD字段类型可以精确保存浮点数据类型. Delphi支持的BCD码的数据类型名为TBCD,它的定义如下: TBcd  = packed record Precision: Byte;                        { 1..64 } SignSpecialPlaces:

[查异常网]-20160331-谈谈J2EE项目中的异常处理

为什么要在J2EE项目中谈异常处理呢?可能许多java初学者都想说:“异常处理不就是try….catch…finally吗?这谁都会啊!”.笔者在初学java时也是这样认为的.如何在一个多层的j2ee项目中定义相应的异常类?在项目中的每一层如何进行异常处理?异常何时被抛出?异常何时被记录?异常该怎么记录?何时需要把checked Exception转化成unchecked Exception ,何时需要把unChecked Exception转化成checked Exception?异常是否应该

Delphi应用程序的调试(十)调试器选项(在IDE中不要使用异常)

可在两个级别上设置调试选项:工程级和环境级.在前面的讲解中讲解了工程级调试选项,通过主菜单[Project | Options…]打开如下对话框: 可在Debugger Options对话框中设置全局级调试选项.从主菜单[Tools | Debugger Options]菜单项调出Debugger Options对话框. 在Debugger Options对话框的底部有一个标记为Integrated debugging的复选框,它控制是否使用IDE调试器调试程序.如果选中Integrated d

在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程!(更好的管理异常)

在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程! 如果直接使用Win32的API函数CreateThread()创建多个线程,也是可以创建的.但是,你应该明白,在每个线程中动态分配和销毁内存块,是需要同步保护的.Delphi语言中有一个在使用多线程环境下至关重要的全局变量IsMultiThread,系统在进行内存分配的时候,根据IsMultiThread变量值判断当前是否使用在多线程环境下,如果该变量为True,哪么,系统在分配和销毁内存的

Delphi 中自定义异常及异常处理的一般方法

delphi中异常定义如下: TCustomException   =   class(Exception)     private     public         constructor   Create(const   Msg:   string );     end; 在一般的编程中,因为涉及到函数的嵌套调用,如果在一个函数中发生异常,且此函数中有try except语句,如果想让上级函数捕捉到异常,则在except end中调用 raise语句即可. 一般编程语言的通用处理异常的结

python中不同的异常类型,如何进行异常处理?

一.错误与异常 程序中难免会出现错误,而错误分为两种 1.语法错误:(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) 2.逻辑错误:(逻辑错误),比如用户输入的不合适等一系列错误 那什么是异常呢? 异常就是程序运行时发生错误的信号,在python中,错误触发的异常如下.异常发生之后,异常之后的代码就不执行了 异常种类:在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识, 不同的类对象标识不同的异常,一个异常标识一种错误 常见的异