Delphi中的异常处理(10种异常来源、处理、精确处理)
一.异常的来源
在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
Delphi中的异常处理(10种异常来源、处理、精确处理)的更多相关文章
- Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool。后面三种布尔类型是为了与其他语言兼容而引入的
bool是LongBool类型. Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool.后面三种布尔类型是为了与其他语言兼容而引入的,一般情况下建议使 ...
- Delphi中的异常处理
转载:http://www.cnblogs.com/doit8791/archive/2012/05/08/2489471.html 以前写Delphi程序一直不注意异常处理,对其异常处理的机制总是一 ...
- C++中常见的几种异常类型
1.C++具有完善的异常捕获机制,采用try{} catch(){}机制,这是C语言无法比拟的 2.常见的几种异常: bad_alloc: 请求分配内存失败, operator new ...
- 大家好,请问在DELPHI中#13和#10是表示什么含义的?
#13: 表示"回车"#10: 表示"换行" ASCII码 Delphi字符 C程序 含义------- ---------- ----- ------ ...
- java中常见的几种异常
算术异常类:ArithmeticExecption空指针异常类:NullPointerException类型强制转换异常:ClassCastException数组负下标异常:NegativeArray ...
- PHP如何进行错误与异常处理(PHP7中的异常处理和之前版本异常处理的区别)
PHP如何进行错误与异常处理(PHP7中的异常处理和之前版本异常处理的区别) 一.总结 一句话总结: throwable接口+Error类 在PHP7更新中有一条:更多的Error变为可捕获的Exce ...
- Java语言中的异常处理
Java语言中的异常处理包括声明异常.抛出异常.捕获异常和处理异常四个环节. throw用于抛出异常. throws关键字可以在方法上声明该方法要抛出的异常,然后在方法内部通过throw抛出异 ...
- jQuery dataTables四种数据来源[转]
2019独角兽企业重金招聘Python工程师标准>>> 四种数据来源 对于 dataTables 来说,支持四种表格数据来源. 最为基本的就是来源于网页,网页被浏览器解析为 DOM ...
- HMS Core 机器学习服务6.4.0版本更新啦,文本翻译功能增加10种小语种语言类型!
近日,HMS Core机器学习服务(ML Kit)文本翻译功能在6.4.0版本更新中增加了10种小语种语言类型,分别是马其他语.马其顿.冰岛.乌尔都语.波斯尼亚语.乌克兰语.加泰罗尼亚语.斯洛文尼亚语 ...
随机推荐
- LeetCode_Subsets
Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset must be ...
- IOS回调机制——代理,通知中心以及Block
Xcode5.0正式版 IOS7和Xcode5正式版在昨天正式可以下载.IOS7不多说了,交互设计,界面风格,操作的简化程度都属于比较领先的水平. 这里来说说Xcode5正式版,和以前的Xcode5测 ...
- UML--核心元素之用例
Use case 一个系统就是由各种各样的愿望组成的. 一个用例就是与参与者actor交互的,并且给参与者提供可观测的有意义的结果的一系列活动的集合. 例如你想做一顿饭吃,你需要完成煮饭和炒菜两件事情 ...
- POJ3261-哈希
这个题让求至少出现K次的最大长度的子串,属于最大化最小值问题,首先应该想到二分求字串的长度,二分的过程是O(logN)的,注意judge的时候怎样判断是否满足情况以及满足情况后l,r的变化.可以给每一 ...
- jQuery插件Jeditable的使用(Struts2处理)
Jeditable - Edit In Place Plugin For jQuery,是一款JQuery就地编辑插件.也就是在页面直接点击需要编辑的内容,就会自动变成文本框进行编辑.它的官方 ...
- Unity目录结构
http://www.cnblogs.com/liudq/p/5540051.htmlUnity中有几个默认目录 Unity5.x Resources 项目中默认的资源路径,会直接打包到游戏包中.即使 ...
- CI框架源代码阅读笔记3 全局函数Common.php
从本篇開始.将深入CI框架的内部.一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说.全局函数具有最高的载入优先权.因此大多数的框架中BootStrap ...
- Node.JS + MongoDB技术浅谈
看到一个Node.JS + MongoDB的小样例,分享给大家.魔乐科技软件学院(www.mldnjava.cn)的讲座 Node.JS + MongoDB技术讲座 云计算 +大数据 ...
- echarts演示笔记
http://echarts.baidu.com/doc/start.html 1.新建一个echarts.html文件,为ECharts准备一个具备大小(宽高)的Dom. <!DOCTYPE ...
- 使用react-native做一个简单的应用-06商品界面的实现
商品界面实现起来很简单,其实就是一个listview的使用: 关于listview的使用,在官方文档里面已经介绍的很详细了.在这里我要提一个坑. listview在Android和iOS中的效果是不一 ...