全捕捉
#前面了解了很多异常,是否所有异常都可以捕捉的呢?其实并非如此。如下示例:
1 #!/usr/bin/python3 2 #-*-coding:UTF-8-*- 3 #异常9.7 4 5 def model_exception(x,y): 6 try: 7 a=x/y 8 b=name 9 except(ZeroDivisionError,NameError,TypeError)as e: 10 print(e) 11 model_exception(2,'')
#在该示例中,调用函数时有一个实参传入的是空值,程序执行结果如下:
1 D:\Python\workspace\datatime\20171219>python 异常9.7.py 2 unsupported operand type(s) for /: 'int' and 'str'
#由结果看到,这里抛出的信息并不像我们之前看到的那样,带有明显的Error关键词或异常词。此处只是告知不支持的操作类型。
#在实际编码过程中,即使程序能处理好几种类型的异常,但有一些异常还是会从我们手掌中溜走。上面示例中的异常就是逃过了try/except语句的检查,对于这种情况我们根本无法预测会发生什么,也无法提前做任何准备。在这种情况下,与其使用不是捕捉异常的try/except语句隐藏异常,不如让程序立即崩溃。
#如果要处理这种异常,该如何操作。示例如下:
1 #!/usr/bin/python3 2 #-*-coding:UTF-8-*- 3 #异常9.7 4 5 def model_exception(x,y): 6 try: 7 a=x/y 8 b=name 9 except: 10 print('Error happend') 11 12 model_exception(2,'')
#程序执行结果如下:
1 D:\Python\workspace\datatime\20171219>python 异常9.7.py 2 Error happend
#由程序和执行结果看到,可以在except子句种忽略所有异常类,从而让程序输出自己定义的异常信息。
#当然,这里只是给出了一种可参考的解决方式。从实用性方面讲,不建议这么做,因为这样捕捉异常非常危险,会隐藏所有没有预先想到的错误。建议使用抛出异常的方式处理,或对异常对象e进行一些检查。