语法5:try - 捕获异常

本文详细介绍了Python中的异常处理结构,包括try、except的基础及复杂用法,else和finally子句的使用,以及try语句的嵌套。通过这些,可以有效地捕获和处理程序运行时可能出现的错误,保证程序的稳定性和可维护性。
部署运行你感兴趣的模型镜像

目录

1. 基础格式

2. try 结构的子句

3. except 子句

3.1 except:

3.2 except type:

3.3 except (type1,type2,*):

3.4 except type as identifier:、except (type1,type2,*) as identifier:

3.5 多条except子句

4. else 子句

5. finally 子句

6. try 语句的嵌套


1. 基础格式

try语句捕获异常,语法结构如下:

#try-except-else/finally语句
try:
    suite
except [expression [as identifier]]:
    suite
[except [expression [as identifier]]:
    suite]*
[else:
    suite]
[finally:
    suite]

#try-finally语句
try:
    suite
finally:
    suite

解释如下:

#try-except-else/finally语句
try:
    检测范围
except [异常类型 [as 异常实例]]:
    异常处理代码
[except [异常类型 [as 异常实例]]:
    异常处理代码]*
[else:
    没有触发异常时执行的代码]
[finally:
    收尾工作执行代码]

#try-finally语句
try:
    检测范围
finally:
    收尾工作执行代码

2. try 结构的子句

try 捕获异常包括 except、else、finally 等几种子句,格式和描述如下表:

子句

描述

except:

捕捉所有(或所有其他)异常

except type:

仅捕捉符合 type 的异常

except type as identifier:

捕捉异常及其实例

except (type1,type2,*):

捕捉多种类型的异常

except (type1,type2,*) as identifier:

捕捉托中类型的异常及其实例

else:

如果没有异常发出则执行

finally:

无论是否发生异常都执行的收尾

try 必须带有一个 except 或 finally语句,或者两个都带,else 为可选;

可以有零个或多个 except 语句,但如果有 else 语句,则至少有一个 except 语句;

几种子句的顺序必须是:try -> except -> else -> finally。

3. except 子句

except 子句几种格式实操如下:

3.1 except:

基础的 try-except 语法结构说明如下:

try:
    检测范围
except:
    出现异常(exception)后的处理代码

针对 try suite 检测范围内的语句,如出现异常,则执行 except suite 后的处理代码,且程序执行不中断;

这样可以避免Python直接报错并中断程序操作,给与程序员更多选择;

直接使用 except 语句会捕获所有异常并统一执行处理代码,可能使得程序员未曾预想到的异常无法被及时发现,需要谨慎使用。

#执行代码
try:
    f = open('不存在的文件.txt')
except:
    print('打开文件失败')

print('报错后,仍可继续执行其余代码!')

#返回结果
打开文件失败
报错后,仍可继续执行其余代码!

3.2 except type:

type 即异常类型,用于对异常做筛选;

type 未赋值时,try suite 执行出现的所有异常,都会使得 except suite 得以执行;

type 赋值时,try suite 执行出现的异常,属于 type 给出的异常类型或子类,才会使得 except suite 得以执行。

#type 未赋值时,try suite 执行出现的所有异常,都会使得 except suite 得以执行
try:
   f = open('不存在的文件.txt')
except:
   print('打开文件失败')
   
打开文件失败

#type 赋值时,try suite 执行出现的异常,属于 type 给出的异常类型或子类,except suite 得以执行。
try:
    f = open('不存在的文件.txt')
except FileNotFoundError:
    print('打开文件失败')
    
打开文件失败

#try suite 执行出现的异常,不属于 type 给出的异常类型或子类,except suite 不执行,直接报错
try:
    f = open('不存在的文件.txt')
except FileExistsError:
    print('打开文件失败')
    
Traceback (most recent call last):
  File "<input>", line 2, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '不存在的文件.txt'

3.3 except (type1,type2,*):

可以通过该语句中多个异常类型的元组,同时捕捉多种类型的异常;

需要注意的是,try suite 中第一个异常不在异常类型元组中时,即使后续存在的异常符合条件,仍会导致程序直接跳出报错。

#使用异常类型元组,对多种类型异常进行捕捉
try:
    1/0
    f = open('不存在的文件.txt')
except (ZeroDivisionError,FileNotFoundError):
    print('打开文件失败')
    
打开文件失败

try:
    f = open('不存在的文件.txt')
    1/0
except (ZeroDivisionError,FileNotFoundError):
    print('打开文件失败')
     
打开文件失败

#第一个异常不在异常类型元组中时,即使后续存在的异常符合条件,仍会导致程序直接跳出报错
try:
    1/0
    f = open('不存在的文件.txt')
except (FileExistsError,FileNotFoundError):
    print('打开文件失败')      
  
Traceback (most recent call last):
  File "<input>", line 2, in <module>
ZeroDivisionError: division by zero

3.4 except type as identifier:、except (type1,type2,*) as identifier:

as identifier,将try suite 执行出现的符合类型的异常具体信息,赋值给 identifier;

as identifier 前必须有异常类型,不可单独使用,否则报错;

identifier 仅可用于 except suite,try-except语句执行完成后再次调用,则失败报错。

#except type as identifier: 执行后返回异常具体信息
try:
    f = open('不存在的文件.txt')
except OSError as error1:
    print('打开文件失败')
    print(error1)
    
打开文件失败
[Errno 2] No such file or directory: '不存在的文件.txt'

#except (type1,type2,*) as identifier: 执行后返回异常具体信息
try:
    1/0
except (OSError,ZeroDivisionError) as error1:
    print('打开文件失败')
    print(error1)
    
打开文件失败
division by zero

#as identifier 前没有异常类型,报错
try:
    1/0
except as error1:
    print('打开文件失败')
    print(error1)
    
  File "<input>", line 3
    except as error1:
           ^
SyntaxError: invalid syntax

#try-except语句执行完成后再次调用 identifier,失败报错。
try:
    f = open('不存在的文件.txt')
except OSError as error1:
    print('打开文件失败')
    
打开文件失败
print(error1)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
NameError: name 'error1' is not defined

3.5 多条except子句

try 语句后,可以搭配多条 except 子句,实现对不同类型异常的分别捕捉和处理;

try suite 出现第一个异常后,即检查各条 except 子句,如异常符合其中某条 except 子句 expression,即完成缺陷捕捉,跳出 try 语句;try suite 后续代码及其余 except 子句 不予执行;

异常同时满足多条 except 子句异常类型设置,按从上到下顺序满足条件的第一条 except 子句异常处理代码执行。

#try suite 出现第一个索引错误异常,按照符合要求 except 子句后续异常处理代码执行
#try suite 后续代码及其余 except 子句 不予执行;
try:    
    s = ['a','b','c']
    s[3]
    1 / 0
    f = open('不存在的文件.txt')
except ZeroDivisionError as error1:
    print(error1)   
except IndexError as error2:
    print(error2)
except FileNotFoundError as error3:
    print(error3)
    
list index out of range

#异常同时满足多条 except 子句,按从上到下顺序满足条件的第一条 except 子句异常处理代码执行
try:    
    f = open('不存在的文件.txt')
except ZeroDivisionError as error1:
    print(error1)   
except OSError as error2:
    print('于 except OSError 子句返回',error2)
except FileNotFoundError as error3:
    print('于 except FileNotFoundError 子句返回',error3)
    
于 except OSError 子句返回 [Errno 2] No such file or directory: '不存在的文件.txt'

4. else 子句

try suite 执行时未出现异常,则执行 else suite;

else 子句前必须有 except 子句,否则报错。

#try suite 执行时未出现异常,则执行 else suite
try:    
    f = open('.\\测试文件\\test.txt')
except:
    print('出错咯!')
else:
    print('没问题!')
    
没问题!

#else 子句前必须有 except 子句,否则报错
try:    
    f = open('不存在的文件.txt')
else:
  File "<input>", line 3
    else:
    ^
SyntaxError: invalid syntax

5. finally 子句

无论 try suite 执行时有无异常,都会执行 finally suite;

finally 前可以没有 except 子句,用于提供无论 try suite 是否因为异常跳出,都可以保证执行的收尾语句;譬如 try suite 中包括打开文件,则可以通过 finally suite提供关闭文件,实现类似上下文管理器的功能,保证异常发生前的文件修改被存储;

对于 try - except -finally 结构来说,如果 try suite 无异常,则跳过 except 子句,执行 finally suite;如果 try suite 发生异常,则先执行 except suite,再执行 finally suite。

#finally 前可以没有 except 子句,用于提供无论 try suite 是否因为异常跳出,都可以保证执行的收尾语句
try:    
    f = open('.\\测试文件\\test.txt','w+')
    f.write('abc')
    1/0
    f.write('123')
finally:
    f.close()
    
Traceback (most recent call last):
  File "<input>", line 4, in <module>
ZeroDivisionError: division by zero
#异常前的文件修改被保存
f = open('.\\测试文件\\test.txt','r+')
f.read()
'abc'

#try suite 无异常,跳过 except 子句,执行 finally suite
try:    
    0/1
except:
    print('异常捕捉!')
finally:
    print('程序收尾!')
    
程序收尾!

#try suite 发生异常,先执行 except suite,再执行 finally suite
try:    
    1/0
except:
    print('异常捕捉!')
finally:
    print('程序收尾!')
    
异常捕捉!
程序收尾!

6. try 语句的嵌套

try 语句也支持嵌套操作;

内层 try 语句中异常未被捕捉,被外层 try 语句捕捉;

内层 try 语句 try suite 中异常被捕捉后,内层 try 语句不再被视为异常,不会被外层 try 语句再次捕捉。

#内层 try 语句中异常未被捕捉,被外层 try 语句捕捉
try:
    print('嵌套try语句!')
    try:
        1/0
    except FileExistsError as error1:
        print(error1)
    finally:
        print('嵌套try语句结束!')
    f = open('不存在的文件.txt')
except ZeroDivisionError as error2:
    print(error2)
finally:
    print('执行完毕!')
    
嵌套try语句!
嵌套try语句结束!
division by zero
执行完毕!

#内层 try 语句 try suite 中异常被捕捉后,内层 try 语句不再被视为异常,不会被外层 try 语句再次捕捉
try:
    print('嵌套try语句!')
    try:
        1/0
    except ZeroDivisionError as error1:
        print(error1)
    finally:
        print('嵌套try语句结束!')
    f = open('不存在的文件.txt')
except FileNotFoundError as error2:
    print(error2)
finally:
    print('执行完毕!')
    
嵌套try语句!
division by zero
嵌套try语句结束!
[Errno 2] No such file or directory: '不存在的文件.txt'
执行完毕!

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

燃烧的火鸟啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值