文章目录
Python中的错误可以有两种类型,即语法错误和异常。错误是程序中的问题,由于该问题,程序将停止执行。另一方面,当发生一些内部事件时,会引发异常,这些事件会改变程序的正常流程
语法错误和异常之间的区别
语法错误: 顾名思义,此错误是由代码中的语法错误引起的。它导致程序终止。
例:
# 始化amount变量
amount = 10000
if (amount > 2999)
print("hallo world")
输出:
异常: 当程序在语法上正确,但代码导致错误时,会引发异常。此错误不会停止程序的执行,但是,它会更改程序的正常流。
例:
# 初始化 marks 变量
marks = 10000
# 使用0执行除法
a = marks / 0
print(a)
输出:
在上面的示例中,当我们尝试将数字除以0时,报了除以0的错误
注意: 异常是 Python 中所有异常的基类。可以在此处检查异常层次结构。
常见的错误类型有哪些?
- IOError: 如果无法打开文件
- KeyboardInterrupt: 当用户按下不需要的键时
- ValueError: 当内置函数收到错误的参数时
- EOFError: 如果在未读取任何数据的情况下命中文件末尾
- ImportError: 如果找不到模块
常见的异常有哪些?
异常名称 | 描述 |
---|---|
IndexError | 检索到列表的错误索引时。 |
AssertionError | 当断言语句失败时发生此问题 |
AttributeError | 当属性分配失败时,将发生此错误。 |
ImportError | 当找不到导入的模块时,会发生这种情况。 |
KeyError | 当找不到字典的键时,就会发生这种情况。 |
NameError | 当变量未定义时,将发生此错误。 |
MemoryError | 当程序内存不足时,就会发生这种情况。 |
TypeError | 当以不正确的类型应用函数和操作时,就会发生这种情况。 |
捕获异常
try 和 except 语句用于捕获和处理 Python 中的异常。可以引发异常的语句保留在 try 子句中,处理异常的语句写在 except 子句中。
例: 让我们尝试访问其索引越界的数组元素并处理相应的异常。
# 处理简单运行时错误的Python程序
# Python 3
a = [1, 2, 3]
try:
print("Second element = %d" % (a[1]))
# 由于数组中只有3个元素,因此引发错误
print("Fourth element = %d" % (a[3]))
except:
print("索引超出范围")
在上面的示例中,可能导致错误的语句放置在 try 语句(在本例中为第二个 print 语句)中。第二个 print 语句尝试访问列表中不存在的第四个元素,这会引发异常。然后,此异常由 except 语句捕获。
如何捕获特定异常,语法
try 语句可以有多个 except 子句,以便为不同的异常指定处理程序。请注意,最多将执行一个处理程序。例如,我们可以在上面的代码中添加 IndexError。添加特定异常的一般语法是 –
# 处理简单运行时错误的Python程序
# Python 3
try:
#可能引发异常的语句
...
except IndexError:
# 发生索引异常后运行的语句
...
except ValueError:
# 发生值异常后运行的语句
...
例: 在 Python 中捕获特定异常
# Program to handle multiple errors with one
# except statement
# Python 3
def fun(a):
if a < 4:
# throws ZeroDivisionError for a = 3
b = a / (a - 3)
# throws NameError if a >= 4
print("Value of b = ", b)
try:
fun(3)
fun(5)
# note that braces () are necessary here for
# multiple exceptions
except ZeroDivisionError:
print("发生了ZeroDivisionError")
except NameError:
print("发生了NameError")
输出
如果将fun(3) 注释掉,输出将会是:
上面的输出之所以如此,是因为一旦python尝试访问b的值,就会发生NameError。
else 如果不出现异常执行
在python中,您还可以在 try-except 块上使用 else 子句,该子句必须在所有 except 子句之后存在。仅当 try 子句未引发异常时,代码才会进入 else 块。
例: 尝试使用 else 子句
# 用try-except描述else子句的程序
# Python 3
# 返回a/b的函数
def AbyB(a, b):
try:
c = ((a + b) / (a - b))
except ZeroDivisionError:
print("不能除以0")
else:
print(c)
if __name__ == '__main__':
# 用于测试上述功能的驱动程序
AbyB(2.0, 3.0)
AbyB(3.0, 3.0)
输出:
finally 无论如何都会执行
Python提供了一个关键字 finally
,该关键字始终在try
后执行。 finally
始终在try
块正常终止后执行,或者在某些异常而终止之后执行。
语法:
try:
# 可能出现异常的代码....
...
except:
# 捕获异常
# 异常之后执行的代码
...
else:
# 如果不出现异常之后执行的代码
...
finally:
# 无论如何都会执行的代码
...
例:
# Python程序最终演示
# try块中未引发异常
try:
k = 5 // 0 # 引发“除以零”异常。
print(k)
# 处理零除法异常
except ZeroDivisionError:
print("不能除以 0 ")
finally:
# 始终执行此代码
# 无论是否生成异常。
print('这句话无论是否出现异常都会执行')
输出结果:
Raising Exception 主动抛出异常
raise 语句允许程序员强制发生特定的异常。raise 中的唯一参数表示要提出的例外情况。这必须是异常实例或异常类(从 Exception 派生的类)。
# 描述引发异常的程序
try:
raise NameError("Hi there") # 抛出 Error
except NameError:
print("这是我主动抛出的异常")
raise # 确定是否引发了异常
输出: