![代替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=1739287752-w9yNOPLSOPelEGNATtTV8hDWTSJL3oee-0-f572b9a9fcdbd5d6b87f8bbbcd2e50c9)
1.15.2 异常捕获——单分支的情况
在Python中使用try…except…else…finally…这样的结构捕获异常,根据需要可以使用简单的单分支形式,也可以使用多分支、带else和带finally等形式。
首先介绍单分支的情况。单分支捕获异常的语法格式为:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/094-2.jpg?sign=1739287752-5UkFHyV7h5uW5k28tmpkre5Y82VPqcIt-0-6a0c282d9c26705b1262227df66e9e8b)
或者
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/094-3.jpg?sign=1739287752-IfHbe5LKaoPjYpxMyRfo1VQQSy2XJedG-0-6753e93290bec5d5c5b44d7fdaca0c61)
第1种形式捕获所有错误,第2种形式捕获指定错误。其中,try部分正常执行指定语句,except部分捕获错误并进行相关的显示和处理。一般尽量避免使用第1种形式,或者在多分支情况下处理未知错误。
在下面的代码中,try部分试图使用一个没有声明和赋值的变量,使用except捕获NameError类型的错误并输出。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/095-1.jpg?sign=1739287752-8ctVESrPMR4LXnAqAdePuDT8pGH0f6Pc-0-d2ca8679d8f85225d2d42e785b629c3c)
因为使用了没有声明的变量,所以捕获到“名称f未定义”的错误,即输出为:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/095-2.jpg?sign=1739287752-OfVLLB9h7xHAqb3vxuqOyWc9JKOxa6f3-0-4a030c50c0a40febff1c011c0f98769c)
1.15.3 异常捕获——多分支的情况
如果捕获到的错误可能属于几种类型,则使用多分支的形式进行处理。在多分支情况下,语法格式可以为:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/095-3.jpg?sign=1739287752-bpIMWw7Oy0lGmuiTioWtn73le8J7tNGm-0-d58103631a46f21bf4660fe05fcff5cc)
下面这段代码执行除法运算,如果出现错误,则会捕获到除数为0的错误和变量未定义的错误,在except语句中用元组指定这两个错误的名称,然后输出捕获到的错误结果。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/095-4.jpg?sign=1739287752-LrkPhrzanazBEPKShkxfKV22B2R7JeA4-0-367be03e326b270e1bce3a07884e6f08)
输出捕获到的错误是“除数为0”,即:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/095-5.jpg?sign=1739287752-ayTQ0GGoqcwKQ6XMkLClqTTPqrEkFqTz-0-72909acc2a40b0963eab1ee8fcddcd6a)
多分支的情况也可以写成下面的形式,按照先后顺序进行判断。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/095-6.jpg?sign=1739287752-bZFG736ZkDGcYA95P6VRVbiBNDzldJuk-0-6e2040f38f95109ceb521659f999c110)
改写上面的示例代码,如下所示。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/095-7.jpg?sign=1739287752-MkfFCgXiMMC3WITuvCZ5RMXTzBPFjQ7k-0-894b13a3c6af8eaa7cd2d6cd0b62be9d)
将得到相同的输出结果:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/096-2.jpg?sign=1739287752-717HzGRYY3APAXqH1CvyYGNwPhI5BwvW-0-fb163de33417d0d846c9730696d05ce8)
1.15.4 异常捕获——try…except…else…
在单分支和多分支的情况下捕获错误并进行处理,如果没有捕获到错误怎么处理呢?这就要用到本节介绍的try…except…else…结构,如下所示。其中,else部分在没有发现异常时进行处理。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/096-3.jpg?sign=1739287752-BFJ943WFpOlEBpijOSHqbnyjKn3WHyLf-0-1aef970b753ecefdf38dc1567091e655)
下面的代码计算3/2,没有捕获到错误时输出一些等号。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/096-4.jpg?sign=1739287752-iut257uefuuFWu5CtGJpgACQS0Y6KLEI-0-be5308e003799397e2a321d3939df1df)
计算结果为1.5,没有出错,输出一些等号。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/096-5.jpg?sign=1739287752-RXavbIrGFQShhakXJzvu8C3IhA7g1JpV-0-8ac5b7285c6e6f643fe01816d13f0470)
1.15.5 异常捕获——try...finally...
在try...finally...结构中,无论是否发生异常都会执行finally部分的语句。其语法格式如下:
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/096-6.jpg?sign=1739287752-qW6q3EqriZMx3UK6L5IgEhG6MPjxPTBx-0-2df9fb6518d1dc8d5aff4eebcc9f1966)
在下面的示例代码中,计算3/0,因为除数为0,所以except部分会捕获到除数为0的错误,输出出错信息。但是即使出错,也会执行finally部分的语句进行处理。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/097-1.jpg?sign=1739287752-NIyqjssBtmpw81lBpUXv6o6hFdk9neKQ-0-c263bf4ab2f62935b812c5558751af22)
输出下面的结果,第1行是除数为0的出错信息,第2行是finally部分的输出结果。
![](https://epubservercos.yuewen.com/10B311/23020647701664206/epubprivate/OEBPS/Images/097-2.jpg?sign=1739287752-iL1a5Iom9ChjVtaVuSYLotduH9kZIHY9-0-9df0af1bb6d62a8e6bb5255322f6d006)