在本文中,我们将讨论如何在适当的示例的帮助下使用 try、except 和 finally 语句处理 Python 中的异常。
Python 中的错误可以分为两种类型,语法错误和异常。错误是程序中的问题,程序将因此停止执行。另一方面,当发生一些内部事件时,会引发异常,这些事件改变了程序的正常流程。
在 Python 中,当程序执行过程中发生错误时,可能会引发几个内置的 Python 异常。以下是 Python 中一些最常见的异常类型:
SyntaxError:当解释器在代码中遇到语法错误(例如关键字拼写错误、缺少冒号或括号不平衡)时,将引发此异常。
TypeError:当操作或函数应用于错误类型的对象(例如将字符串添加到整数)时,将引发此异常。
NameError:当在当前作用域中找不到变量或函数名称时,将引发此异常。
IndexError:当索引超出列表、元组或其他序列类型的范围时,将引发此异常。
KeyError:当在字典中找不到键时,会引发此异常。
ValueError:当使用无效的参数或输入调用函数或方法时,例如,当字符串不表示有效整数时,尝试将字符串转换为整数,则会引发此异常。
AttributeError:当在对象上找不到属性或方法时,例如尝试访问类实例的不存在的属性,则会引发此异常。
IOError:当 I/O 操作(如读取或写入文件)由于输入/输出错误而失败时,会引发此异常。
ZeroDivisionError:尝试将数字除以零时,会引发此异常。
ImportError:当 import 语句无法找到或加载模块时,将引发此异常。
这些只是 Python 中可能发生的多种异常类型的几个示例。实际项目开发过程中请务必使用 try-except 块或其他错误处理技术正确处理代码中的异常,以便优雅地处理错误并防止程序崩溃。
顾名思义,此错误是由代码中的错误语法引起的。它导致程序终止。
例:
代码中存在语法错误。' 语句后应跟冒号 ( :
),并且 ' 语句应缩进以位于 ' print'
if'
if'
块内。
amount = 10000
if(amount > 2999)
print("You are eligible to purchase Dsa Self Paced")
输出:
File "E:\StudyPython\lesson-list\demo_list.py", line 9
if(amount > 2999)
^
SyntaxError: invalid syntax
当程序在语法上正确,但代码导致错误时,会引发异常。此错误不会停止程序的执行,但是,它会更改程序的正常流程。
在此代码中,我们将“标记”除以零,因此将发生称为“ZeroDivisionError”的错误
marks = 10000
a = marks / 0
print(a)
输出:
在上面的例子中,当我们试图将一个数字除以 0 时,引发了 ZeroDivisionError。
注意:Exception 是 Python 中所有异常的基类。可以阅读源码查看异常层次结构。
例:
TypeError:当操作或函数应用于错误类型的对象时,会引发此异常。下面是一个示例:
这里会引发“TypeError”,因为要添加的两种数据类型不同。
x = 5
y = "hello"
z = x + y
输出:
尝试 catch 块来解决它:
代码尝试将整数 (x
) 和字符串 (y
) 相加,这不是有效的操作,它将引发 x
y
TypeError
。代码使用 try
和 except'
块来捕获此异常并打印错误消息。
x = 5
y = "hello"
try:
z = x + y
except TypeError:
print("Error: cannot add an int and a str")
输出:
try 和 except 语句用于捕获和处理 Python 中的异常。可以引发异常的语句保存在 try 子句中,处理异常的语句写在 except 子句中。
这里我尝试访问索引越界的数组元素并处理相应的异常。
a = [1, 2, 3]
try:
print ("Second element = %d" %(a[1]))
print ("Fourth element = %d" %(a[3]))
except:
print ("An error occurred")
输出:
在上面的示例中,可能导致错误的语句被放置在 try 语句中(在我们的例子中是第二个 print 语句)。第二个 print 语句尝试访问列表中不存在的第四个元素,这会引发异常,然后except 语句捕获此异常。
try 语句可以有多个 except 子句,用于指定不同异常的处理程序。请注意,最多将执行一个处理程序。例如,我们可以在上面的代码中添加 IndexError。添加特定例外的一般语法是 -
try:
# statement(s)
except IndexError:
# statement(s)
except ValueError:
# statement(s)
在 Python 中捕获特定异常
该代码定义了一个函数 fun(a)
,该函数根据输入a
进行b
计算。如果a
小于 4,则尝试除以零,从而产生ZeroDivisionError
代码调用fun(3)
和fun(5)
在 try-except 块内。它处理ZeroDivisionError
中的fun(3)
并打印“ZeroDivisionError Occurred and Handled”。NameError
块不执行,因为代码中没有NameError
异常。
def fun(a):
if a < 4:
b = a/(a-3)
print("Value of b = ", b)
try:
fun(3)
fun(5)
except ZeroDivisionError:
print("ZeroDivisionError Occurred and Handled")
except NameError:
print("NameError Occurred and Handled")
输出:
如果对 fun(3) 行进行注释,则输出将是
上面的输出之所以如此,是因为一旦 python 尝试访问 b 的值,就会发生 NameError。
在 Python 中,还可以在 try-except 块上使用 else 子句,该子句必须在所有 except 子句之后存在。仅当 try 子句未引发异常时,代码才会进入 else 块。
该代码定义了一个函数,该函数AbyB(a, b)
计算c
为 ((a+b) / (a-b)) 并处理一个势ZeroDivisionError
.如果没有除以零错误,它会打印结果。调用计算并打印 ,而调用AbyB(2.0, 3.0) 和 AbyB(3.0, 3.0)
尝试除以零-5.0
,导致捕获 aZeroDivisionError
,并打印“a/b results in 0”。
def AbyB(a , b):
try:
c = ((a+b) / (a-b))
except ZeroDivisionError:
print ("a/b result in 0")
else:
print (c)
AbyB(2.0, 3.0)
AbyB(3.0, 3.0)
输出:
Python 提供了一个关键字 finally,它总是在 try 和 except 块之后执行。最终块始终在 try 块正常终止后执行,或者在 try 块因某些异常而终止后执行。
try:
# Some Code....
except:
# optional block
# Handling of exception (if required)
else:
# execute if no exception
finally:
# Some code .....(always executed)
该代码尝试执行整数除以零,从而得到ZeroDivisionError
.它捕获异常并打印“不能除以零”。无论异常情况如何,finally
该块都会被执行并打印“This is always executed”。
try:
k = 5//0
print(k)
except ZeroDivisionError:
print("Can't divide by zero")
finally:
print('This is always executed')
输出:
raise
语句允许程序员强制发生特定的异常。raise 中的唯一参数表示要引发的异常。这必须是异常实例或异常类(派生自 Exception 的类)。
此代码有意使用try
块中的raise
语句引发消息NameError
“Hi there”。然后,它捕获异常,打印“异常”,并使用raise
重新引发相同的NameError
异常。这演示了如何在 Python 中引发和处理异常,从而允许自定义错误消息和进一步的异常传播。
try:
raise NameError("Hi there")
except NameError:
print ("An exception")
raise
上述代码的输出将简单地打印为“异常”,但由于最后一行中的 raise 语句,最后一行也会发生运行时错误。因此,命令行上的输出将如下所示
总的来说,Python 中异常处理的好处大于缺点,但重要的是要明智而谨慎地使用它,以保持代码质量和程序可靠性。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。