在Python中,异常处理是一种机制,用于处理在程序执行过程中可能出现的错误或异常情况,以防止程序崩溃。异常处理通过使用try和except块来捕获和处理异常。
python中不同类型的异常
在 Python 中,有几个内置异常,当程序执行期间发生错误时可能会引发这些异常。以下是 Python 中一些最常见的异常类型:
- SyntaxError:当解释器在代码中遇到语法错误(例如拼写错误的关键字、缺少冒号或括号)时,会引发此异常。
- TypeError:当将操作或函数应用于错误类型的对象时(例如将字符串添加到整数中),会引发此异常。
- NameError:当在当前作用域中找不到变量或函数名称时,会引发此异常。
- IndexError:当索引超出列表、元组或其他序列类型的范围时,会引发此异常。
- KeyError:当在字典中找不到键时会引发此异常。
- ValueError:当使用无效参数或输入调用函数或方法时,例如在字符串不表示有效整数时尝试将字符串转换为整数时,会引发此异常。
- AttributeError:当在对象上找不到属性或方法时,例如尝试访问类实例不存在的属性时,会引发此异常。
- IOError:当 I/O 操作(例如读取或写入文件)由于输入/输出错误而失败时,会引发此异常。
- ZeroDivisionError:尝试将数字除以零时会引发此异常。
- ImportError:当导入语句无法找到或加载模块时,会引发此异常。
这些只是 Python 中可能发生的多种异常类型的几个示例。使用 try-except 块或其他错误处理技术在代码中正确处理异常非常重要,以便方便处理错误并防止程序崩溃。
语法错误和异常之间的区别
语法错误:顾名思义,此错误是由代码中的错误语法引起的。它导致程序终止。
例子:
# 初始化变量 amount
amount = 10000
# 检查您是否有资格购买 Dsa Self Paced
if amount > 2999:
print("您有资格购买")
输出:
异常:当程序语法正确但代码导致错误时,就会引发异常。该错误不会停止程序的执行,但是会改变程序的正常流程。
例子:
# initialize the amount variable
marks = 10000
# perform division with 0
a = marks / 0
print(a)
输出:
在上面的示例中,当我们尝试将数字除以 0 时,引发了 ZeroDivisionError。
注意: Exception是Python中所有异常的基类。
例子:
1) TypeError:当对错误类型的对象应用操作或函数时,会引发此异常。这是一个例子:
x = 5
y = "hello"
z = x + y # Raises a TypeError: unsupported operand type(s) for +: 'int' and 'str'
输出:
Traceback (most recent call last):
File "7edfa469-9a3c-4e4d-98f3-5544e60bff4e.py", line 4, in <module>
z = x + y
TypeError: unsupported operand type(s) for +: 'int' and 'str'
尝试 catch 块来解决它:
x = 5
y = "hello"
try:
z = x + y
except TypeError:
print("Error: cannot add an int and a str")
输出:
Error: cannot add an int and a str
Try 和 except 语句 – 捕获异常
Try 和 except 语句用于捕获和处理 Python 中的异常。可以引发异常的语句保留在 try 子句中,而处理异常的语句则写在 except 子句中。
示例:让我们尝试访问索引越界的数组元素并处理相应的异常。
# Python program to handle simple runtime error
#Python 3
a = [1, 2, 3]
try:
print ("Second element = %d" %(a[1]))
# Throws error since there are only 3 elements in array
print ("Fourth element = %d" %(a[3]))
except:
print ("An error occurred")
输出:
Second element = 2
An error occurred
在上面的示例中,可能导致错误的语句被放置在 try 语句中(在我们的例子中是第二个 print 语句)。第二个打印语句尝试访问列表中不存在的第四个元素,这会引发异常。然后这个异常被 except 语句捕获。
捕获特定异常
一条 try 语句可以有多个 except 子句,以指定不同异常的处理程序。请注意,最多会执行一个处理程序。例如,我们可以在上面的代码中添加IndexError。添加特定异常的一般语法是:
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 Occurred and Handled")
except NameError:
print("NameError Occurred and Handled")
输出:
ZeroDivisionError Occurred and Handled
如果您对 fun(3) 行进行注释,则输出将为:
NameError Occurred and Handled
上面的输出之所以如此,是因为只要 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("a/b 的结果为 0")
else:
print(c)
# 驱动程序来测试上述函数
AbyB(2.0, 3.0)
AbyB(3.0, 3.0)
输出:
-5.0
a/b 的结果为 0
Python 中的finally关键字
Python 提供了一个关键字finally,它总是在 try 和 except 块之后执行。Final块总是在try块正常终止之后或者try块由于某种异常而终止之后执行。
语法:
try:
# 一些代码....
except:
# 可选块
# 异常处理(如果需要)
else:
# 如果没有异常则执行
finally:
# 一些代码.....(总是执行)
例子:
# Python程序演示finally块的用法
# 在try块中没有引发异常
try:
k = 5 // 0 # 引发除零异常
print(k)
# 处理除零异常
except ZeroDivisionError:
print("不能除以零")
finally:
# 无论是否引发异常,这个块都会被执行
print('这总是会被执行')
输出:
不能除以零
这总是会被执行
引发异常
raise 语句允许程序员强制发生特定的异常。raise 中的唯一参数指示要引发的异常。这必须是异常实例或异常类(从 Exception 派生的类)。
# 程序演示引发异常
try:
raise NameError("Hi there") # 引发错误
except NameError:
print("异常")
raise # 用于确定是否引发了异常
上面代码的输出将简单地打印为“异常”,但由于最后一行中的 raise 语句,最后也会出现运行时错误。因此,命令行上的输出将类似于
文件“/home/d6ec14ca595b97bff8d8034bbf212a9f.py”,第 5 行,在 <module> 中
raise NameError("Hi There") # Raise Error
NameError: Hi There
异常处理的优点:
- 提高程序可靠性:通过正确处理异常,您可以防止程序因意外错误或输入而崩溃或产生不正确的结果。
- 简化的错误处理:异常处理允许您将错误处理代码与主程序逻辑分开,从而更容易阅读和维护代码。
- 更干净的代码:通过异常处理,您可以避免使用复杂的条件语句来检查错误,从而获得更干净且更具可读性的代码。
- 更轻松的调试:当引发异常时,Python 解释器会打印回溯,显示异常发生的确切位置,从而更轻松地调试代码。
异常处理的缺点:
- 性能开销:异常处理可能比使用条件语句检查错误慢,因为解释器必须执行额外的工作来捕获和处理异常。
- 增加代码复杂性:异常处理可能会使您的代码更加复杂,特别是当您必须处理多种类型的异常或实现复杂的错误处理逻辑时。
- 可能的安全风险:异常处理不当可能会泄露敏感信息或在代码中创建安全漏洞,因此仔细处理异常并避免暴露太多有关程序的信息非常重要。
总体而言,Python 中异常处理的优点大于缺点,但为了保持代码质量和程序可靠性,明智且谨慎地使用它非常重要。
原创文章,作者:jkhxw,如若转载,请注明出处:https://www.jkhxw.com/python-exception-handling/