9-python异常处理
一、语法错误
拼写错误
关键字、变量名、函数名等不小心拼写错误
当关键字书写错误,程序运行时系统提示 SyntaxError
错误,而变量名、函数名等书写错误则提示 NameError
错误
如:(打印时变量名书写错误)
语法规范错误
如逗号、冒号、引号等使用不规范,使用了中文符号,代码缩进错误等,一般来说,python标准缩进是以 4 个空格作为一个缩进,但也可以依据个人习惯,用 Tab 键也可以。
二、异常处理
基本语法
python程序在运行时出现异常而未被处理,程序就会中止运行,因此要对这些异常进行捕获并处理,保证程序正常运行。
python使用 try
语句处理可能出现的异常,其基本语法如下:
try:
<语句(块)> #可能会发生异常的语句(块)
except <异常名1>: #可能发生的异常的名称
<语句(块)> #发生该异常1如何处理
except <异常名2>: #可能发生的异常的名称
<语句(块)> #发生该异常2如何处理
...
else:
<语句(块)> #未发生任何异常将要执行的语句
finally:
<语句(块)> #不论是否发生异常都要执行的语句
这几个语句之间的关系可用下图表示:

在实际应用中可以不使用 elae
语句 和 finally
语句
实际常用两种形式为:
try:
<语句(块)>
except <异常名>:
<语句(块)>
try:
<语句(块)>
except <异常名>:
<语句(块)>
finally:
<语句(块)>
如:例1(计算列表所有数字的和):
L = [1,2,3,4,5,'a',6,7]
s = 0
for i in L:
try:
s += i
except TypeError:
print('{}不是数字'.format(i))
continue
print('所有数字的和为:%d'%s)
########### 输 出 ###############
a不是数字
所有数字的和为:28
例2:(打开一个文件并向其中写入内容)
L = ['A','B','C','D']
def writing(x):
f = open('my_test.txt','a')
try:
f.write(L[x])
except:
print('IndexError')
pass
finally:
f.close()
print('文件已关闭')
print('无越界异常')
writing(1)
print('有越界异常')
writing(10)
########### 输 出 ###############
无越界异常
文件已关闭
有越界异常
IndexError
文件已关闭
python内置异常及处理
异常名 | 含义(引发异常原因) |
---|---|
AttributeError | 调用不存在的方法 |
EOFError | 遇到文件末尾 |
ImportError | 导入模块出错 |
IndexError | 列表越界 |
IOError | I/O操作引发的异常,如文件打开出错 |
KeyError | 使用字典不存在的关键字引发的异常 |
NameError | 变量名不存在 |
TabError | 语句块缩进不正确 |
ValueError | 搜索列表中不存在的值 |
ZeroDivisionError | 除数为0引发异常 |
except语句主要几种用法:
except:
捕获所有异常except <异常名>:
捕获指定异常名的异常except(异常名1, 异常名2):
捕获指定的2个异常except <异常名> as <数据>:
捕获指定异常及其附加数据
except(异常名1, 异常名2) as <数据>:
捕获异常名1或异常名2及其异常附加的数据
三、手工抛出异常
除了程序运行错误会引发异常外,人工也能指定发出异常,并向异常传递数据。
raise语句
程序员可以自定义一些异常,然后通过raise
语句来引发异常,其使用方式有以下几种:
raise 异常名
raise 异常名(附加数据)
raise 类名
例如:
不论是系统抛出的异常,还是手工抛出的,都可以用 try...except...
语句处理
assert语句
assert
语句可以说是raise语句的简化版,翻译为"断言",使用形式为:
assert <条件测试> ,<异常附加数据>
assert语句引发异常的前提是:<条件测试> 为假
例如:(这个例子中当i =8 时抛出异常,异常名是 AssertionError
)
使用assert语句不用指出异常名,但raise语句需要。同样 assert语句抛出的异常也能用前面的异常处理方法来处理。
自定义异常类
这里说的自定义并非完全从头开始定义,可以继承其原有的 Exception
来创建自己的子异常类,最简单的定义就只是继承了 Exception 类,如下:
class MyError(Exception):
pass
如果需要加上一些异常信息,可以重载 __init__
和 __str__
这两个方法
例如:
class MyError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return self.value
raise MyError('00000000') # 使用raise语句第三种方式抛出异常
这里使用raise语句第三种方式 raise <类名>
直接抛出异常。
本文来自博客园,作者:aJream,转载请记得标明出处:https://www.cnblogs.com/ajream/p/15383596.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人