DELPHI 异常处理 详解(全)
EInvalidCast 类型转换异常
哑异常
EAbort 调用 Abort 产生,不显示错误提示框
对象异常类 对象异常类是针对非组件对象引发的异常而定义的. 对象异常类包括:
1 流异常类 2 打印异常类 3 图形异常类 4 字符串链表异常类
流异常类
流异常是指在程序中进行与流相关的操作时产生的异常.流异常类的基类是 EStreamError,其 他流异常类都直接或间接从它派生. 派生关系见书 48 页图
EInvalidGraphic 异常满足下列情况之一时引发:
当应用程序试图向一个并不包含合法的位图,图象,元文件或用户自定义图形类型的文件中装 入图象时. 当应用程序试图装入不可识别扩展名的文件时 当图象与 LoadFromClipboardFormat 或 SaveToClipboardFormat 中的格式不匹配时. 当应用程序试图将图象的 PixelFormat 设为不支持的值
堆异常和(I/O 异常) 堆异常:
EOutOfMemory 堆中没有足够的内存完成操作 EInvalidPointer 试图访问一个堆外的指针 (I/O 异常) EInOutError DOS 输入/输出错误
字符转换/类型转换异常和哑异常
字符转换异常 EConvertError 数字到字符串或字符串到数 字转换错误
具体分为运行时库异常类,对象异常类和组件异常类三大类.
运行时库异常类(RTL) 运行时库异常类可分为以下几种: 1 整数计算异常 2 浮点计算异常 3 硬件异常 4 堆异常 5 输入输出异常(I/O 异常) 6 字符 转换异常 7 类型转换异常 8 哑异常
整数计算异常
EIntError 整数计算异常(基类) EDivByZero 整数除 0 溢处 EIntOverFlow 整数溢出 ERangeError 整数越界
当索引项超出链表范围时
当字符串链表的 Duplicates 属性设置为 dupError 同时应用程序试图加入一个重复的字符串时. 当向已排序的字符串链表中插入字符串时.
组件异常类
组件异常类用于响应组件异常,组件异常是由于对 VCL 组件进行操作时,违反了组件的使用 规则及其特征而引发的,可分为两大类: 通用组件异常、专用组件异常、通用组件异常。 常见的有非法操作异常,组件异常和资源不足异常三种类型,对应于 EInvalidOpetation,EComponentError 和 EOutOfResource 异常类.
Delphi7 异常处理机制
传统程序设计中,用如下的伪代码方法来检查和处理程序错误:
执行一个任务 If 前一个任务未能正确执行 执行错误处理 执行下一个任务 If 前一个任务未能正确执行 执行错误处理 ……
Delphi7 异常处理机制 例;
try Age := StrToInt(Edit1.Text); ShowMessage(Format('生于%d 年', [YearOf(Now) - Age]));
例:
try raise Exception.Create('我抛出的异常!');
except on E: Exception do showmessage('异常类名称:' + E.ClassName + #13#10 + '异常信息:' + E.Message);
end;Delphi7 内置的异常类 Delphi7 根据异常现象的类型定义了相应的异常类,这些异常类又称为 Delphi7 内置的异常类.
EInvalidGraphicOperation 异常在满足下列条件之一时发生:
应用程序访问图象中不存在的扫描线时. 应用程序不能成功写入图象时. 应用程序在画布未处于有效状态时进行绘制. 应用程序装入未知或不支持的图象格式时. 应用程序将图象的 PixelFormat 设为不支持的值时 不能分配该操作的句柄时.
(2)在程序中抛出一个异常。 根据不同的情况抛出异常是使用异常的最基本的模式。在 Delphi 中,由 raise 语句来实 现。 【语法】raise 异常类.Create(‘异常的缺省说明’);
(3)在 try…except…end 中更加精确的捕捉异常。 使用 on E:异常类 do…结构可以在 do 体内处理特定异常类所抛出的异常。
Delphi_异常处理_详解(全).txt
Delphi 异常处理 详解
[1] Exception 类的定义在 SysUtils 单元中。
[2] Delphi 也支持不从 Exception 继承的异常类,但是我觉得这么做并不十分的明智。
一、异常的来源 在 Delphi 的应用程序中,下列的情况都比较有可能产生异常。 (1)文件处理 (2)内存分配 (3)Windows 资源 (4)运行时创建对象和窗体 (5)硬件和操作系统冲突
答案很清楚:异常提供了一种更加灵活和开放的方式,使得后来的编程者可以来根据实 际的情况处理这种错误,而不是使用预先设定好的处理结果。
Delphi7 异常处理 了解什么是异常和 Delphi7 中提供的异常类 掌握 Delphi7 环境下自定义异常的方法和异常 处理的语法结构与实现
异常
什么是异常 程序开发过程中,有编译期错误和运行期错误,编译期错误很容易发现,而运行期错误(逻辑错 误和异常)往往很难预料.为了程序的稳定性和可靠性,就需要对程序异常处理和保护.
浮点计算异常
EMathError 浮点计算异常(基类) EInvalidOp 无效浮点操作指令 Eoverflow 浮点操作上溢
Eunderflow 浮点操作下溢 EZeroDivide 浮点计算除 0
硬件异常
EProcessorException 硬件异常(基类) ESingleStep 应用程序产生单步中断 Ebreakpoint 应用程序产生断点中断 Efault 故障(继承 EProcessorException,也是基类) EStackFault 对处理器栈段的非法访问 EPageFault 内存管理器无法正确使用交换文件 EGPFault 保护性错误,一般由未初始化指针或对象造成 EInvalidOpCode 处理器遇到未定义指令
(3)不存在 try…except…finally…end 结构来既处理异常,又保护资源分配的结构,但 是,try…except…end 结构允许嵌套到 try…finally…end 结构中,从而实现既处理异常,又 保护资源的分配。
三、异常的精确处理 (1)定义一个异常。 在 Delphi 中,每个异常都是 Exception[1]类的一个派生类[2]。因此,定义一个异常就是 定义一个 Exception 类的派生类。 type EMyException = class(Exception); 当然,基类可以是 Exception 或者 Exception 的任何一个任何层次的派生类。
四、异常的调试 在 Delphi IDE 中,解除“Debugger Options”(可以使用菜单 Tools—>Debugger Options… 进行访问)中的 Integrated Debugging 复选框的勾选状态可以进行异常的调试。
五、异常的补充说明 (1)每一段程序都有可能产生错误!这是软件业的一个不容置疑的现象和规律。事实 上,传统的 if…else…结构完全可以解决所有的错误,使用 Exception 机制也没能够回避在最 原始的层次,通过遍历可能的情况来产生异常的做法,那么,为什么还要异常机制?
except on EConvertError do showmessage('输入编辑框的不是一个有效的数字!'); on ERangeError do showmessage('输入编辑框的年龄值太大!');
end;异常类 Delphi7 根据异常类型定义了相应的异常类.所有异常类的基类都是 Exception 类. Delphi7 内置了大量的异常类,用户也可以通过 Exception 类自定义异常类.
打印异常
打印异常是由于应用程序向不存在的打印机发送打印命令或由于某种原因打印工作无法送 到打印机时引发的. 打印异常类为 Eprinter,定义于 PrintenvalidGraphic 和 EInvalidGraphicOperation 两个类均定义于 Graphics 单元
使用异常进行错误处理
结构化异常处理是 Delphi 语言内建的特性.为我们处理异常提供了方便.处理异常有两方面: 1 异常处理可确保适当地恢复在应用程序中分配或改变的任何资源. 2 结构化异常处理为开发人员提供了一种一致的处理各种类型运行期错误的方式
Delphi7 异常处理机制
异常处理的基本思想是通过提供规范方式处理软,硬件错误的能力,使程序更加健壮. 异常处理可以将处理错误的代码与正常的逻辑处理代码相分离. Delphi 缺省的方式是在应用程序收到异常之前捕获异常.IDE 会给出一个”预警”对话框,以指 明应用程序将要产生异常. 异常处理机制是一种程序设计安全策略,它是建立在保护块思想上,通过 try 和 end 语句块对 代码的封装确保在程序发生异常时,程序能够正常运行或释放所占用的资源.
异常:理解为一种特殊的事件,该事件发生时,程序的正常执行将被打断. 由程序导致的不正常情况是错误而不是异常,程序错误与异常不是相同的概念. 异常是为方便用户报告错误并处理错误而创建的机制,一般是由操作系统完成的. 运行期错误处理
软件开发过程中,程序员必须提供适度的方式来处理不可避免的错误.一般方法如下: 1 传统方法 2 使用异常进行错误处理
记住异常类的要点:
1 异常类是响应不同异常现象的入口. 2 熟悉异常类的层次结构.
Exception 异常类
Exception 是所有异常类的基类,它并不是以’T'开头,而是以’E'开头,它的派生类也是以’E'开头 的. Exception 类定义于 SysUtils 单元中. Exception 类最常用的方法是 Create 方法: Constructor Create(const Msg:string); Exception.Create(‘我自己创建的异常!’); 该方法用于创建一个异常类的实例,也可以显示错误信息,也可直接用这个方法提交一个异常 raise Exception.Create(‘我抛出的异常!’);
Delphi 中的程序调试及异常处理
编译期错误
编译期错误也称为语法错误。在DelPhi中,通常是当程序代码违 反了object Pascal语言的语法规则时发生这类错误。比较常见的语法错 误有标识符未定义或拼写错误;语句的末尾漏掉分号;赋值语句中漏 写昌号;begin与end末配对;括号末配对;引号末配对等。
如果程序代码中有语法错误,编译不能通过,代码编辑器的状态 行将给出错误信息提示,并加亮有语法错误的代码行。
Try…except语句 Raise语句 Try…finally语句 自定义异常类及其使用
Delphi对异常的自动处理
Delphi为应用程序提供了一套缺省的自动异常处理机制,即当前 模块发生错误后退出当前模块并给出错误信息,而并不立即引起应用 程序的中止。 若程序在Delphi的集成开发环境中运行,在给出相应错 误信息的同时,还尽可能定位出错的位置。
I
Overflow checking 检查整数操作是否溢出
Q
信息(Messages)
选项 Show hints
说明 使编译器显示提示信息
Show Warnings
使编译器显示警告信息
编译选项3
语法选项(Syntax options)
选项 Strick var-strings
Complete Boolean eval
举例
举例(格式1)
举例: var i:integer; r:real; begin i:=0; try
r:=8/i; showmessage(floattostr(r)); except showmessage('除数为零'); end; end;
Try…except语句(格式2)
格式2: Try
Try…except语句(格式3)
第6章Delphi程序异常处理与调试技术.
第六章程序异常处理与调试技术在Delphi中有两种程序错误,一种是编译错误,在程序编辑阶段就可以由编译器发现并给出提示。
另外一种是运行错误,这类错误不能在编译阶段查出,只能在程序执行时发现,称为运行错误。
Delphi提供了一种机制来处理运行错误,保护程序的正常执行,这种机制就是异常处理。
异常处理的方法是把正常的执行程序同错误的处理程序分离开来,这样可以保证在没有错误时,程序正常执行,当发生错误时,执行错误处理部分的程序,然后程序跳出保护模块,继续执行后续的程序。
6.1 Object Pascal异常的种类异常的种类:Delphi内建的异常类,程序员自定义的异常类。
异常基类及其属性和主要方法:在Delphi中,所有异常的基类是Exception 类。
所有其他异常类都是由该类派生而来。
1. exception属性该类有两个基本属性:HelpContext和Message。
(1)Exception.HelpContext属性该属性的定义如下:▪Type ThelpContext= -MaxLongint..MaxLongint;▪Property HelpContext:ThelpContext;HelpContext是ThelpContext类的一个实例,它提供了与异常对象联系在一起的上下文相关帮助信息的序列号。
该序列号决定当发生异常时用户按F1键显示的一个异常错误的帮助信息。
(2)Exception.Message属性该属性的定义如下:property Message: string该属性存储异常发生时的错误信息。
可以通过该属性在提示错误对话框中显示错误信息字符串。
2.exception方法(1)Exception.Create方法该方法的定义形式为:Constructor Create(Const Msg: String);该方法用来产生一个带有一条简单提示信息的对话框,对话框中的提示内容由Msg提供(2)Exception.CreateFmt方法该方法的定义格式如下:Constructor CreateFmt(Const Msg:String;Const Args:Array of Const) ;该方法用来产生一个带有格式化字符串提示信息的对话框,格式化的字符串由Msg和Args数组共同提供,其中数组Args负责提供用于格式化的数值。
Delphi异常处理机制
Delphi异常处理机制Delphi的异常处理⽅式有两种:try...except...end;try...finally...end;。
try...except主要⽤于捕获异常,只有出现异常的时候才会执⾏except部分。
try...finally主要⽤于资源释放,⽆论try语句块是否有异常都会执⾏finally语句块。
如下⾯的代码:tryraise exception.create('发现异常'); //在try语句块中抛出⼀个异常excepton e:Exception do//捕获异常beginshowMessage(e.message);end;end;⽤try..except是不会出现异常提⽰信息的对话框,需要⾃⼰主动去show出异常信息。
⽽try..finally.则会出现异常提⽰信息。
try..except和try..finally可以相互嵌套。
使⽤on e:Exception do可以精确处理特定的异常。
Exception是所有异常类的基类,Delphi内部就定义了处理常见异常的异常类(在SysUtils单元中),也可以从Exception继承定义⾃⼰的异常类使⽤raise语句可以抛出⼀个异常:EMyException=class(Exception)end;trytryraise EMyException.Create('我⾃⼰的异常');excepton e:EMyException doshowMessage(e.message);end;finallyshowMessage('我始终被执⾏');end。
异常处理与程序调试(三)Delphi教程.
异常处理与程序调试(三)Delphi教程12.4.3 断点的使用12.4.3.1 设置断点设置断点首先在Code Editor中选定你想设置断点的代码行,而后进行如下的任一种操作:● 单击选定代码行左边的空白● 按F5 ● 选择Code Editor加速菜单的Toggle BreakPoint项● 选择Run|Add Breadpoint打开断点编辑对话框(Edit BreakPoint Dialog Box),而后选择New去确认一个新的断点设置或选择Modify去对一个存在的断点进行修改● 从BreakPoint List加速菜单中选择Add BreakPoint项断点必须位于可执行代码行上,凡设置在注释、空白行、变量说明上的都是无效的。
另外,断点既可以在设计状态下设置也可以在运行调试状态下设置。
12.4.3.2 断点的操作断点列表窗口(BreakPoint List Window)列出了所有断点所在的源文件名、行号、条件以及已通过的次数。
如果一个断点非法或失去功能,则在列表窗口中变灰。
断点列表窗口可以通过选择View|BreakPoint菜单打开。
断点列表窗口是断点操作的基础。
1.显示和编辑断点处的代码利用断点列表窗口可以快速找到断点在源代码中的位置。
首先选定断点而后从加速菜单中选择View Source或Edit Source。
此时Code Editor更新,显示该断点位置处的代码。
如果选择的是View Source,则断点列表窗口仍保持活动;如果选择的是Edit Source,则Code Editor获得输入焦点,可以在断点位置修改源代码。
2.断点功能的丧失和恢复使断点失去功能可以使断点从当前程序运行中隐藏起来。
假如你定义了一个断点当前并不需要,但可能在以后使用,则这一功能是很有用的。
断点列表窗口加速菜单的Disable BreakPoint和Disable All BreakPoints项可以使当前选中断点或所有断点失去功能。
delphi字符串处理中的怪异现象与处理方式
delphi字符串处理中的怪异现象与处理⽅式1,怪异现象:字符串相加操作不正常!以上代码,明显输出字符串应含有后缀“.jpg”,但实际输出却不含后缀(如下),字符串加法操作似乎不起作⽤了!采⽤showMessage进⾏输出,看看结果如何?结果仍是不显⽰字符串后缀,但可以看到字符串偏左显⽰,似乎后⾯还有很多不可见字符。
2,怪异原因:字符串中含有\0,即字符串终⽌符以上现象已经看出,字符串加法失效的原因可能是含有某些不可见字符,那到底是什么字符呢?回到这些字符串产⽣的源头,即下⾯由字节数组转换成字符串函数:显然,此函数未考虑len长度以内可能含有的\0字符,如果buffer中len长度以内含有\0字符,那么这些\0字符也会被复制进result字符串中,造成后续字符串加法“失效”。
3,解决⽅案:修改函数将函数修改如下,判断逐字节判断buffer,遇到\0就返回,这样转换的字符串就不含\0了。
问题解决。
//字节转换为字符串 $D4 $C1--> '粤'function BytesToString(buffer: Array of byte; offset:integer; len: integer): string;varstr: string;i : Integer;beginSetLength(str, len);for i:=0 to len-1 dobeginif buffer[offset-1+i]=0 then break; //遇到ASCII 0不再复制!Move(buffer[offset-1+i], str[1+i], 1);//注意,这⾥是从str[1]开始复制的end;//Move(buffer[offset-1], str[1], len);//注意,这⾥是从str[1]开始复制的//ShowMessage (str);SetLength(str, i);result := str;end;以上这篇delphi 字符串处理中的怪异现象与处理⽅式就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
Delphi异常处理tryexcept语句和tryfin(精)
一、异常的来源在Delphi的应用程序中,下列的情况都比较有可能产生异常。
(1)文件处理(2)内存分配(3)Windows 资源(4)运行时创建对象和窗体(5)硬件和操作系统冲突二、异常的处理(1)try…except…end;在try体内的代码发生异常时,系统将转向except部分进行异常的处理。
这是Delphi处理异常的最基本的方式之一。
(2)try…finally…end;这种异常处理结构一般用于保护Windows的资源分配等方面,它确保了无论try体内的代码是否发生异常,都需要由系统进行最后的统一处理的一些Windows对象的正确处理。
和try…except…end不同,该结构的finally部分总被执行。
(3)不存在try…except…finally…end结构来既处理异常,又保护资源分配的结构,但是,try…except…end结构允许嵌套到try…finally…end结构中,从而实现既处理异常,又保护资源的分配。
三、异常的精确处理(1)定义一个异常。
在Delphi中,每个异常都是Exception[1]类的一个派生类[2]。
因此,定义一个异常就是定义一个Exception类的派生类。
type EMyException =class(Exception;当然,基类可以是Exception或者Exception的任何一个任何层次的派生类。
(2)在程序中抛出一个异常。
根据不同的情况抛出异常是使用异常的最基本的模式。
在Delphi中,由raise语句来实现。
【语法】raise 异常类.Create(…异常的缺省说明‟; (3)在try…except…end 中更加精确的捕捉异常。
使用on E:异常类do…结构可以在do体内处理特定异常类所抛出的异常。
四、异常的调试在Delphi IDE中,解除“Debugger Options”(可以使用菜单Tools—>Debugger Options…进行访问)中的Integrated Debugging复选框的勾选状态可以进行异常的调试。
Delphi 讲义教程 第五章 程序调试与异常处理
1. 语法错误 语法错误就是在编写程序代码时没有遵守 Object Pascal 语言的语法规则,在程序编译 时,只要有这种错误,Delphi的调试器就会自 动找出,并把出错的语句突出显示,同时在 代码编辑器的下方给出相应的出错提示。 2. 运行错误 程序语法正确,能正确编译,但程序在执行的 过程中发生了错误,这种错误称为运行错 误。遇到这种错误,操作系统会自动中止程 序的运行,并给出相应提示。
1. 异常保护与try ... finally ... end;语句 该语句的格式如下: try .….. // 被保护的代码块 finally .….. // 处理语句 end;
2. 响应异常和try ... except ... end;语句 该语句结构提供了一个可以根据需要进行自定的异常处理的机 制。其一般格式如下: try // 以下为保护代码块 if <异常条件> raise <异常对象> except // 以下为异常处理块 on <异常类1> do <处理过程1或语句1> // 捕获异常为异常类1的处理 on <异常类2> do <处理过程2或语句2> // 捕获异常为异常类2的处理 on .….. else <其他处理过程或语句> // 该子句可以缺省 end;
二、使用断点
Delphi的集成调试器可以让用户在程序 代码的某些行上设置标记,使程序执行 到这些行时暂停执行,这些标记就称为 断点。
1. 断点的设定与取消
在代码编辑器中,把光标移到某一行上,按
下 F5 键或用鼠标点击该行的左边区域,可以 为该行代码设断点。
在已设断点的行上重复以上所述设置断点的
本章学习要点
熟练并灵活地掌握各种调试和跟踪程序
delphi异常类
302 此卷太碎,不能完成这个操作。
303 不能打开文件,因为它正在被删除。
487 试图访问无效的地址。
534 算术结果超过 32 位。
535 管道的另一有一进程。
536 等候打开管道另一端的进程。
994 拒绝访问扩展属性。
995 由于线程退出或应用程序请求,已放弃 I/O 操作。
1081 这个服务所运行的处理和服务控制管理器相同。 所以,如果服务处理程序意外中止的话,服务控制管理器无法进行任何操作。
1082 这个服务尚未设置恢复程序。
1083 配置成在该可执行程序中运行的这个服务不能执行该服务。
1084 不能以安全模式开始这项服务
1100 已达磁带的实际结尾。
209 正在发送的信号不正确。
210 无法设置信号处理程序。
212 段已锁定且无法重新分配。
214 连到该程序或动态链接模块的动态链接模块太多。
215 无法嵌套调用 LoadModule。
230 管道状态无效。
231 所有的管道范例都在使用中。
232 管道正在被关闭。
233 管道的另一端上无任何进程。
1074 系统当前以最新的有效配置运行。
1075 依存服务不存在,或已被标记为删除。
1076 已接受使用当前引导作为最后的有效控制设置。
1077 上次启动之后,仍未尝试引导服务。
1078 名称已用作服务名或服务显示名。
1079 此服务的帐户不同于运行于同一进程上的其他服务的帐户。
1080 只能为 Win32 服务设置失败操作,不能为驱动程序设置。
1065 指定的数据库不存在。
Delphi异常处理与程序调试(2)
Delphi异常处理与程序调试(2)12.3 异常响应异常响应为开发者提供了一个按自己的需要进行异常处理的机制。
try …except …end形成了一个异常响应保护块。
与finally不同的是:正常情况下except 后面的语句并不被执行,而当异常发生时程序自动跳到except,进入异常响应处理模块。
当异常被响应后异常类自动清除。
下面的例子表示了文件打开、删除过程中发生异常时的处理情况:uses Dialogs;varF: Textfile;beginOpenDialog1.Title := 'Delete File';if OpenDialog1.Execute thenbeginAssignFile(F, OpenDialog1.FileName);tryReset(F);if MessageDlg('Erase ' +OpenDialog1.FileName + '?',mtConfirmation, [mbYes, mbNo], 0) = mrYes thenbeginSystem.CloseFile(F);Erase(F);end;excepton EInOutError doMessageDlg('File I/O error.', mtError, [mbOk], 0);on EAccessDenied doMessageDlg('File access denied.', mtError, [mbOk], 0);end;end;end.保留字on…do用于判断异常类型。
必须注意的是:except后面的语句必须包含在某一个on…do模块中,而不能单独存在。
这又是同finally不同的一个地方。
12.3.1 使用异常实例上面所使用的异常响应方法可总结为如下的形式:on ExceptionType do{响应某一类的异常}这种方法唯一使用的信息是异常的类型。
delphi异常和错误处理
异常和错误处理(基于Delphi/VCL)有人在看了我的“如何将界面代码和功能代码分离(基于Delphi/VCL)”之后,提到一个问题,就是如何对服务端的类的错误进行处理。
在基于函数的结构中,我们一般使用函数返回值来标明函数是否成功执行,并给出错误类型等信息。
于是就会有如下形式的代码:RetVal := SomeFunctionToOpenFile();if RetVal = E_SUCCESSED then......else if RetVal = E_FILENOTFOUND then......else if RetVal = E_FILEFORMATERR then......else then......使用返回错误代码的方法是非常普遍的,但是使用这样的方法存在2个问题:1、造成冗长、繁杂的分支结构(大量的if或case语句),使得控制流程变得复杂2、可能会有没有被处理的错误(函数调用者如果不判断返回值的话)而异常是对于错误处理的面向对象的解决方案。
它可以报告错误,但需要知道的是,并非由于错误而引发了异常,而仅仅是因为使用了raise。
在Object Pascal中,抛出异常使用的是raise保留字。
在任何时候(即使没有错误发生),raise都将会导致异常的发生。
异常可以使得代码从异常发生处立刻返回,从而保护其下面的敏感代码不会得到执行。
通过异常从函数返回和正常从函数返回(执行到函数末尾或执行了Exit)对于抛出异常的函数本身来说是没有什么区别的。
区别在于调用者处,通过异常返回后,执行权会被调用者的try...e xcept块所捕获(如果它们存在的话)。
如果调用者处没有try...except块的话,将不会继续执行后续语句,而是返回更上层的调用者,直至找到能够处理该异常的try...except块。
异常被处理后,将继续执行try...except块之后的语句,控制权就被留在了处理异常的这一层。
