python基础教程(第三版)学习笔记(八)

第八章异常
异常事件可能是错误(如试图除以零),也可能是通常不会发生的事情。为处理这些异常事件,可在每个可能发生这些事件的地方都使用异常处理机制。
8.1 异常是什么
Python使用异常对象来表示异常状态,并在遇到错误时引发异常。异常对象未被处理(或捕获)时,程序将终止并显示一条错误消息(traceback)。
8.2让事情沿着你指定的轨道出错
8.2.1 raise语句
要引发异常,可使用raise语句,并将一个类(必须是Exception的子类)或实例作为参数。将类作为参数时,将自动创建一个实例。
'''

raise Exception("这里发生了异常!")

'''

Traceback (most recent call last):
  File "xx.py", line 9, in <module>
    raise Exception("这里发生了异常!")
Exception: 这里发生了异常!


------------------
(program exited with code: 1)

请按任意键继续. . .


在这示例(raise Exception)中,引发的是通用异常,并添加了错误消息:这里发生了异常!
在python中异常是一个类。其中Exception是通用异常类,其他几乎所有异常都是从它派生而来。
除通用异常外常见的还有以下列出一些异常类:
i、   属性异常 AttributeError       引用属性或给它赋值失败时引发
ii、  系统异常 OSError              操作系统不能执行指定的任务(如打开文件)时引发,有多个子类
iii、 索引异常 IndexError           使用序列中不存在的索引时引发,为LookupError的子类
iv、  键异常   KeyError            使用映射中不存在的键时引发,为LookupError的子类
v、   名称异常 NameError           找不到名称(变量)时引发
vi、  代码异常 SyntaxError         代码不正确时引发
vii、 类型异常 TypeError           将内置操作或函数用于类型不正确的对象时引发
vii、 值异常   ValueError          将内置操作或函数用于这样的对象时引发:其类型正确但包含的值不合适
ix、  除法异常 ZeroDivisionError   在除法或求模运算的第二个参数为零时引发
8.2.2 自定义异常类
就像创建其他类一样,但务必直接或间接地继承Exception。也可在自定义异常类中添加方法。
'''

class My_Exception(Exception):
    def __init__(self):
        print("这是一个自定义异常,没发生什么。")


    

    
'''
8.3 捕获异常
使用try/except语句在可能出现异常的地方捕获异常。
'''
'''

try:
    x=int(input("请输入一个数:"))
    y=int(input("请再输入一个非零的数:"))
    print(x/y)
except ZeroDivisionError:
    print("对不起,你刚才误把第二个数输入零了!")


'''
    
'''

请输入一个数:3
请再输入一个非零的数:0
对不起,你刚才误把第二个数输入零了!


------------------
(program exited with code: 0)

请按任意键继续. . .


8.3.1 不用提供参数
捕获异常后,如果要重新引发它(即继续向上传播),可调用raise且不提供任何参数。
8.3.2 多个except子句
格式为
'''

try:
    pass
except Exception:
    pass
    pass
except My_Exception:
    pass
    pass


    
'''
8.3.3 一箭双雕
如果要使用一个except子句捕获多种异常,可在一个元组中指定这些异常,如下所示:
'''

try:
    pass
except (A_Error,B_Error,C_Error):
    pass

'''
8.3.4 捕获对象
要在except子句中访问异常对象本身,可使用两个而不是一个参数。(请注意,即便是在你捕获多个异常时,也只向except提供了一个参数——一个元组。)
'''

try:
    x=int(input("请输入一个数:"))
    y=int(input("请再输入一个非零的数:"))
    print(x/y)
except ZeroDivisionError as e:
    print("对不起,你刚才误把第二个数输入零了!",e)

'''

请输入一个数:1
请再输入一个非零的数:0
对不起,你刚才误把第二个数输入零了! division by zero


------------------
(program exited with code: 0)

请按任意键继续. . .


其中division by zero为参数e捕获的ZeroDivisionError对象。
8.3.5 一网打尽
要使用一段代码捕获所有的异常,只需在except语句中不指定任何异常类即可。形如:
'''

try:
    pass
except:
    print("这里有异常。但不知道是什么异常!!有点可怕。")

'''
像这样捕获所有的异常很危险,因为这不仅会隐藏你有心理准备的错误,还会隐藏你没有考虑过的错误。
8.3.6 万事大吉
在有些情况下,在没有出现异常时执行一个代码块很有用。为此,可像条件语句和循环一样,给try/except语句添加一个else和finally子句。
(以下代码为汤老师授课笔记)
'''

try:
    #可能出现异常的代码
    pass
except Exception:
    #出现异常时执行的操作
    pass
else:
    #不出现异常时执行的操作
    pass
finally:
    #无论出现或不出现异常都要执行的代码
    pass

'''
8.3.7 最后
最后的finally子句,可用于在发生异常时执行清理工作。这个子句是与try子句配套的。

8.4 异常和函数
异常和函数有着天然的联系。如果不处理函数中引发的异常,它将向上传播到调用函数的地方。如果在那里也未得到处理,异常将继续传播,直至到达主程序(全局作用域)。如果主程序中也没有异常处理程序,程序将终止并显示栈跟踪消息。

8.5 异常之禅
异常处理并不是很复杂。如果你知道代码可能引发某种异常,且不希望出现这种异常时程序终止并显示栈跟踪消息,可添加必要的try/except或try/finally语句(或结合使用)来处理它。有些任务使用if/else完成时看似很自然,但实际上使用try/except来完成要好得多。
8.6 不那么异常的情况
警告警告
,指出情况偏离了正轨,可使用模块warnings中的函数warn。
'''

from warnings import warn
warn("这里好像出现点问题")

'''

xx.py:2: UserWarning: 这里好像出现点问题
  warn("这里好像出现点问题")


------------------
(program exited with code: 0)

请按任意键继续. . .

(待续)

猜你喜欢

转载自blog.csdn.net/micorjun/article/details/83651677