注册 登录
Python基础教程

第一章: 环境搭建,安装Python

第二章: 挑选一款趁手的IDE

第三章: 计算机基础知识

第四章: 命令行基础知识

第五章: 从全局把握Python

第六章: Python语言基础

第七章: Python流程控制

第八章: Python数据类型与运算

第九章: Python字符串类型

第十章: Python列表类型

第十一章: Python元组类型

第十二章: Python字典类型

第十三章: Python集合类型

第十四章: Python函数处理

第十五章: Python文件处理

第十六章: Python面向对象

第十七章: Python异常处理

第十八章: Python模块处理

第十九章: Python高级编程

第二十章: Python项目实战

首页 > Python基础教程 > 第十七章: Python异常处理 > 17.2节: Python中的异常处理

17.2节: Python中的异常处理

薯条老师 2020-05-26 07:47:43 384306 0

编辑 收藏

广州Python,Java小班周末班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人,学员的平均就业薪资有11K。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Python量化投资,Python机器学习,Java中高级后端开发。授课详情请点击:http://chipscoco.com/?cate=6

17.2.1 try,except语句

在Python中使用try语句来声明可能会产生异常的代码块,使用except语句来捕获异常,并对异常进行处理。

try,except 的基本语法:

注意:语法结构中的[]符号表示可选参数的意思,即非必须的选项。

try:
    # 可能发生异常的代码块,须注意代码的缩进规则
    pass
except [Exception [as identifier]]:
    # (1) except语句负责捕获异常,后面带一个异常类型
    # (2) except语句后不带任何参数时,等同于except Exception
    # (3) as是一个可选选项,参数identifier表示捕获到的异常对象名
    pass
else:
    # else语句是可选的,用来定义不发生异常时所执行的代码
    pass
Python解释器是线性执行的,会先执行try子句,如果Python解释器没有抛出异常,所有except子句都会被忽略。 如果try子句的某一行代码发生了异常,那么try子句中余下的部分将被忽略。抛出的异常类型一旦与except语句后面的异常类型匹配,except子句下面的代码将会执行。

异常类型匹配是指抛出的异常对象e与except语句指定的异常类型E,在执行isinstance(e,E)时为True。即异常对象e所属的异常类型与E是同一类型或者是异常类型E的子类。

代码实例:

# __desc__ = 使用try,except来捕获和处理异常
 
try:
    print(hellopython)
except NameError:
    print("name error occurred")
else:
    print("no exception")
 
"""
程序的输出:
name error occurred
"""
如果抛出的异常类型不与任何except子句匹配,那么这个异常将会沿着调用链不断上传 ,直到异常被处理,否则会异常终止程序。现在定义两个简单的函数,来演示这样的异常处理过程:

# __desc__ = 异常沿着调用链不断上传
 
def throw_name_error():
    # 变量hellopython未定义,会抛出NameError的错误异常
    print(hellopython)
 
def holyshit():
    # 在函数holyshit中调用throw_name_error函数
    # 由于throw_name_error函数未对异常进行捕获,所以会上传至函数holyshit中
    throw_name_error()  
 
if __name__ == "__main__":
    try:
        holyshit()
        # 在函数holyshit中未对异常进行捕获,会继续上传至函数holyshit的调用方
    except Exception as e:
        # 对从函数holyshit中抛出的异常进行处理
        # 可以直接输出异常的信息
        print(e)
 
"""
程序的输出:
name 'hellopython' is not defined
"""
使用except语句捕获异常时,可以传递一个元祖类型的参数,在元祖中指定需捕获的异常类型。Python解释器会按从左到右的顺序来进行类型匹配,一旦匹配就会停止匹配过程。

基本的语法结构:

try:
    # 可能发生异常的代码块,须注意代码的缩进规则
    pass
except (exception1,exception2) as identifier:
    # as是一个可选选项,参数identifier表示捕获到的异常对象名
    pass
传递元祖类型的参数进行多个异常类型的匹配,等价于使用多个单行的except语句进行异常捕获:

try:
    # 可能发生异常的代码块,须注意代码的缩进规则
    pass
except exception1:
    pass
except exception2:
    pass
代码实例:

# __desc__ = 使用try,except来捕获和处理异常
 
try:
    # 直接输出未定义的变量hellopython,会抛出NameError
    print(hellopython)
except (IndentationError, Exception, NameError) as e:
    print(e)
else:
    print("no exception")
 
"""
(1) 程序抛出的NameError对象与IndentaionError显然不匹配,所以会
继续往右进行匹配
(2) NameError对象与Exception类型匹配吗?答案是肯定的,因为Exception是
NameError的基类。所以尽管程序抛出的NameError对象与except子句中的NameError
类型完全匹配,但由于Exception的顺序排在其前面,所以会优先匹配Exception。
 
(3)程序的输出为:
name 'hellopython' is not defined
"""
在实际开发中,应按就近原则将子类排在最前面,将父类排在末尾。

17.2.2 raise语句

Python同时提供了raise语句,通过raise语句可以手动地抛出指定的异常。raise语句的基本语法:
raise Exception(what) [from Exception2]
参数Exception表示对应的异常类型,what是传递给Exception类型的可选描述性参数,用来对异常信息进行描述。from是可选项,用来表示raise语句抛出的异常类型,由from语句中的Exception2异常所引发。

raise语句中的from子句,可从其字面意思进行理解,from有"从哪里来","来自于"的意思,表示raise语句中的异常来自于哪一个异常。from后面的参数为None时,会忽略异常的上下文信息。
代码实例:

# __desc__ = 异常沿着调用链不断上传
 
def just_throw_error():
    # 通过raise语句来手动地抛出ValueError的异常
    raise ValueError("just throw value error")
 
 
if __name__ == "__main__":
    try:
        just_throw_error()
    except (NameError, ValueError, Exception) as e:
        print(e)
 
"""
程序的输出:
name 'hellopython' is not defined
"""
raise语句后面不带任何参数时,会重新抛出当前已抛出的异常:

# __desc__ = 异常沿着调用链不断上传
 
def just_throw_error():
    # 通过raise语句来手动地抛出ValueError的异常
    raise ValueError("just throw value error")
 
def just_rethrow_error():
    # 捕获从just_throw_error函数中抛出的异常
    try:
        just_throw_error()
    except (NameError, ValueError):
        # 如果抛出的异常为NameError或ValueError,就重新抛出
        raise
 
 
if __name__ == "__main__":
    try:
        just_rethrow_error()
    except Exception as e:
        print(e)
 
"""
程序的输出:
just throw value error
"""

17.2.3 finally语句

在Python中使用finally语句来定义程序的清理操作, 同else子句一样,finally语句也是可选的。 finally语句与else语句的区别在于,不论是否发生异常都会执行finally子句中的代码。finally语句必须是异常处理的最后一个语句:

# __desc__ = 使用try,except来捕获和处理异常
 
try:
    # 手动抛出ValueError
    raise ValueError("raise value error manually")
except (IndentationError, NameError, ValueError) as e:
    print(e)
else:
    # 未抛出异常时才会执行else语句下的代码
    print("no exception")
finally:
    # 不论是否发生异常,都会执行finally语句下的代码    
    print("finally")
 
 
"""
程序的输出:
raise value error manually
finally
"""

17.2.4 知识要点

(1) 在Python中通过try语句来声明可能会发生异常的代码块,用except语句来对异常进行捕获和处理。
(2) 异常处理中的else语句用来定义未发生异常时的程序处理逻辑
(3) finally语句主要用来定义程序的清理操作,不论是否发生异常,都会执行finally语句下的代码。

17.2.5 最具实力的小班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习打算参加小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。

(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,免费领取课程大纲
(3) Java后端开发工程师高薪就业班,月薪11K-20K, 免费领取课程大纲
(4) Python大数据分析,量化投资就业班,月薪12K-25K,免费领取课程大纲

扫码免费领取Python学习资料:


欢迎 发表评论:

请登录

忘记密码我要注册

注册账号

已有账号?请登录