![代替VBA!用Python轻松实现Excel编程](https://wfqqreader-1252317822.image.myqcloud.com/cover/254/43738254/b_43738254.jpg)
1.15 异常处理
在程序编写完成以后,难免会出现这样或那样的错误,如果不能捕获这些错误并进行处理,程序运行过程就会中断。本节介绍在Python中进行异常处理的方法。
1.15.1 常见的异常
在Python中常见的异常如表1-21所示。对于不同类型的错误,Python给它们指定了名称。在编程过程中如果出现错误,则可以捕获该错误,判断是否是指定类型的错误并进行相应的处理。
表1-21 Python中常见的异常
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/093-3.jpg?sign=1739277232-hoPQNlv3M0NzSpvL2SUP69TljcAIvXnW-0-c0043519526196992915f68378c994df)
1.15.2 异常捕获——单分支的情况
在Python中使用try…except…else…finally…这样的结构捕获异常,根据需要可以使用简单的单分支形式,也可以使用多分支、带else和带finally等形式。
首先介绍单分支的情况。单分支捕获异常的语法格式为:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/094-2.jpg?sign=1739277232-vXXczWMKH4Iqy4SWOiCulibNa7r6ziUb-0-fc2af7b3d133161a6d492053ab792531)
或者
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/094-3.jpg?sign=1739277232-pNArjtEwMz7uGQSlrULjepMk32rV797o-0-dd3edc9270f3deb181e2db523ad10c77)
第1种形式捕获所有错误,第2种形式捕获指定错误。其中,try部分正常执行指定语句,except部分捕获错误并进行相关的显示和处理。一般尽量避免使用第1种形式,或者在多分支情况下处理未知错误。
在下面的代码中,try部分试图使用一个没有声明和赋值的变量,使用except捕获NameError类型的错误并输出。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/095-1.jpg?sign=1739277232-4iZ0uFxwtlzT0fJSZDqUWQpGSDwP6N7O-0-12c6a02afd1e6f7318aa37d27b489352)
因为使用了没有声明的变量,所以捕获到“名称f未定义”的错误,即输出为:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/095-2.jpg?sign=1739277232-53yK4MFLJt4eCYOYJAUAe63it6mkwfYx-0-efb7155e0ac9833504ba83dc32879d10)
1.15.3 异常捕获——多分支的情况
如果捕获到的错误可能属于几种类型,则使用多分支的形式进行处理。在多分支情况下,语法格式可以为:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/095-3.jpg?sign=1739277232-yKpJ9KJGlq4YDKeTguBSVsj6jzYC8FGj-0-a2a65db95f4a0ba044dd81193f166da5)
下面这段代码执行除法运算,如果出现错误,则会捕获到除数为0的错误和变量未定义的错误,在except语句中用元组指定这两个错误的名称,然后输出捕获到的错误结果。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/095-4.jpg?sign=1739277232-e5Rq2edx2amhbarFSAU407uwlYlUEoea-0-a5efa8c986e9e1bcfe6bd6cc57255a23)
输出捕获到的错误是“除数为0”,即:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/095-5.jpg?sign=1739277232-ZcPeptbUugAKGuj822ThvQHIB53G1dnm-0-9640d605591d192582eda2c35b291d23)
多分支的情况也可以写成下面的形式,按照先后顺序进行判断。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/095-6.jpg?sign=1739277232-HCaQGNdaVyq05juIMMCoUswMtL1joxRo-0-36c1bbc891837672a707dcfb38083334)
改写上面的示例代码,如下所示。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/095-7.jpg?sign=1739277232-XnkBCpNOJFBdTdkLVn1V7whHYod7SiT9-0-2d2d48cd0b9eee27f89b7794ae74de05)
将得到相同的输出结果:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/096-2.jpg?sign=1739277232-XWDQPCqJxqs7xhfejsV75Zcfon5SRkAa-0-e7c08eb27a54e28036d09078ab1cd882)
1.15.4 异常捕获——try…except…else…
在单分支和多分支的情况下捕获错误并进行处理,如果没有捕获到错误怎么处理呢?这就要用到本节介绍的try…except…else…结构,如下所示。其中,else部分在没有发现异常时进行处理。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/096-3.jpg?sign=1739277232-fs7PNyiisZErFKNPiZQZydPdkm2SCVmv-0-a5ef1d9792a81eb567591ebdf43df679)
下面的代码计算3/2,没有捕获到错误时输出一些等号。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/096-4.jpg?sign=1739277232-o8tyWLhR3acmsOBbsYTwMZNRSQnKDvkj-0-5e89eb855a9047e6129242912e40f811)
计算结果为1.5,没有出错,输出一些等号。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/096-5.jpg?sign=1739277232-5GDDaTEJPFBNV1QNlS8a7Pc255ibfwGP-0-aef2732e18a0c9b1da92ced34170ced7)
1.15.5 异常捕获——try...finally...
在try...finally...结构中,无论是否发生异常都会执行finally部分的语句。其语法格式如下:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/096-6.jpg?sign=1739277232-5RP2FSTUTpe5Ewc1h3TAEBN5PZPf1C0M-0-8c3193ec82ea4ccfe133b7528a21a2c9)
在下面的示例代码中,计算3/0,因为除数为0,所以except部分会捕获到除数为0的错误,输出出错信息。但是即使出错,也会执行finally部分的语句进行处理。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/097-1.jpg?sign=1739277232-2WnJCagmD79hNpBBPQMRsfACagMK6IPu-0-14b12784c8e8653a30885099b73a2d3c)
输出下面的结果,第1行是除数为0的出错信息,第2行是finally部分的输出结果。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/097-2.jpg?sign=1739277232-YXaChLl8pimtd64aLSu35QWFEnIsyfbT-0-8fe7016ef9ad7a746f3d47a6370cad6a)