捕获异常
python完整的异常处理语法结构如下:
特别说明:
1.try块是必需的,except块和finally,当try块没有出现异常时,程序会执行else块
2.try块后只有一个except快块会被执行,不可能有多个except块被执行。
3.原则:先捕获小异常再捕获大异常
实例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import sys try: a = int(sys.argv[1]) b = int(sys.argv[2]) c = a / b print("您输入的两个数相除的结果是:",c) except IndexError: print("索引错误:运行程序时输入的参数个数不够") except ValueError: print("数值错误:程序只能接受整数参数") except ArithmeticError: print("算术错误") except Exception: print("未知异常") # 输出结果: E:myprojcrazy_python 77.2>python div_test.py 3 0 算术错误
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import sys try: a = int(sys.argv[1]) b = int(sys.argv[2]) c = a / b print("您输入的两个数相除的结果是:",c) except (IndexError, ValueError, ArithmeticError): print("程序发生了数组越界、数字格式异常、算术异常之一") except: print("未知异常") # 输出结果 E:myprojcrazy_python 77.2>python multi_exception_test.py 4 0 程序发生了数组越界、数字格式异常、算术异常之一
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def foo(): try: fis = open("a.txt") except Exception as e: print(e) print(e.args) print(e.errno) print(e.strerror) foo() # 输出结果: [Errno 2] No such file or directory: 'a.txt' (2, 'No such file or directory') 2 No such file or directory
4. 1try或except中的return语句,不会影响finally块的执行;但是os._exit()语句会退出python解释器,导致finally块试去执行机会。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import os def test(): fis = None try: fis = open("a.txt") except OSError as e: print(e.strerror) return os._exit(1) finally: if fis is not None: try: fis.close() except OSError as ioe: print(ioe.strerror) print("执行finally里的资源回收!") test() # 输出结果: No such file or directory 执行finally里的资源回收!
4.1不能在finally块使用return或raise。finally块中的return或raise语句,会导致try、except块中的return、raise语句失效
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def test(): try: return True # 由于finally中包含return,该return语句失效 finally: return False a = test() print(a) # 输出结果 False
抛出异常(使用raise引发异常)
不管是系统引发的异常,还是程序员使用raise手动引发的异常,python解释器对异常的处理没有任何差别,都可以使用try...except来捕获它
raise语句有如下三种常用用法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def main(): try: mtd(3) except Exception as e: print("程序出现异常:", e) mtd(3) def mtd(a): if a > 0: raise ValueError("a的值大于0.不符合要求") main() # 输出结果: D:softpython36python.exe D:/myproject/crazy_python/07/7.3/raise_test.py Traceback (most recent call last): 程序出现异常: a的值大于0.不符合要求 File "D:/myproject/crazy_python/07/7.3/raise_test.py", line 17, in <module> main() File "D:/myproject/crazy_python/07/7.3/raise_test.py", line 9, in main mtd(3) File "D:/myproject/crazy_python/07/7.3/raise_test.py", line 14, in mtd raise ValueError("a的值大于0.不符合要求") ValueError: a的值大于0.不符合要求
except和raise同时使用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class AuctionException(Exception): pass class AuctionTest: def __init__(self, init_price): self.init_price = init_price def bid(self, bid_price): d = 0.0 try: d = float(bid_price) except Exception as e: # 此处只是简单地打印异常信息 print("转换出异常:", e) # 再次引发自定义异常 # raise AuctionException("竞拍价必须是数值,不能包含其他字符!") # ① raise AuctionException(e) if self.init_price > d: raise AuctionException("竞拍价比起拍价低,不允许竞拍!") initPrice = d def main(): at = AuctionTest(20.4) try: at.bid("df") except AuctionException as ae: # 再次捕获到bid()方法中的异常,并对该异常进行处理 print('main函数捕捉的异常:', ae) main() # 输出结果: 转换出异常: could not convert string to float: 'df' main函数捕捉的异常: could not convert string to float: 'df'