Python错误处理
Python 有许多内置异常,当您的程序遇到错误(程序中出现错误)时会引发这些异常。当这些异常发生时,Python 解释器会停止当前进程并将其传递给调用进程,直到它被处理。如果不处理,程序将崩溃。例如,让我们考虑一个程序,我们有一个功能 A是调用函数B,进而调用功能C。如果函数中发生异常C但未在 中处理C,则异常传递到B,然后传递到A。
如果从未处理过,则会显示一条错误消息,我们的程序会突然意外停止。Python中的错误可以有两种类型,即语法错误和异常。错误是程序中导致程序停止执行的问题。另一方面,当发生一些改变程序正常流程的内部事件时,会引发异常。本文晓得博客为你介绍Python错误处理方式。
Python语法错误和Python异常之间的区别
在深入研究之前,重要的是要了解 Python 编程中的两种不需要的条件——语法错误和异常。当代码不符合 Python 关键字、命名风格或编程结构时,会发生语法错误异常。解释器在其解析阶段看到无效语法并引发SyntaxError异常。程序在发生语法错误的地方停止并失败。这就是为什么语法错误是无法处理的异常。
这是一个带有语法错误的示例代码块(注意括号中的“if”条件后没有冒号):
a = 10
b = 20
if (a < b)
print('a is less than b')
c = 30
print (c)
解释器找出错误并指出行号。请注意它在语法错误后如何不继续:
File "test.py", line 4
if (a < b)
^
SyntaxError: invalid syntax
Process finished with exit code 1
另一方面,当代码没有语法错误但遇到其他错误情况时会发生异常。这些条件可以在代码中解决——在当前函数中或在调用堆栈中。从这个意义上说,异常并不是致命的。如果Python程序优雅地处理异常,它可以继续运行。
这是一个没有任何语法错误的 Python 代码示例。它试图对两个字符串变量运行算术运算:
a = 'foo'
b = 'bar'
print (a % b)
引发的异常是 TypeError:
Traceback (most recent call last):
File test.py", line 4, in
print (a % b)
TypeError: not all arguments converted during string formatting
Process finished with exit code 1
当存在错误的数据类型时,Python会抛出 TypeError 异常。与 TypeError 类似,有几个内置异常,例如:模块未找到错误、导入错误、内存错误、操作系统错误、系统错误。可以参考Python 文档以获取完整的异常列表。
使用 Try-Except 捕获 Python 异常
现在您了解了如何在 Python中手动抛出异常,是时候看看如何处理这些异常了。大多数现代编程语言使用称为“try-catch”的结构来处理异常。对于Python,它的基本形式是“try-except”。try-except 块如下所示:
...
try:
<--program code-->
except:
<--exception handling code-->
<--program code-->
...
在这里,程序流程进入“try”块。如果出现异常,则控件跳转到“except”块中的代码。您放入“except”块的错误处理代码取决于您认为“try”块中的代码可能遇到的错误类型。
这是 Python 的“try-except”的一个例子(经常被错误地称为“try-catch-exception”)。假设我们希望我们的代码仅在Python版本为3时运行。在代码中使用一个简单的断言如下所示:
# 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")
构造中的“except”关键字也接受您要处理的错误类型。为了说明这一点,让我们回到上一节中的日期脚本。在该脚本中,我们假设用户将以“YYYY-MM-DD”格式输入日期。但是,作为开发人员,您应该迎合任何类型的错误数据,而不是依赖于用户。
使用 Try-Except-Else 捕获 Python 异常
Python“try-except”结构中的下一个元素是“else”:
...
try:
<--program code-->
except <--Exception Type 1-->:
<--exception handling code-->
except <--Exception Type 2-->:
<--exception handling code-->
except <--Exception Type 3-->:
<--exception handling code-->
...
else:
<--program code to run if "try" block doesn't encounter any error-->
...
如果“try”块没有引发异常,“else”块就会运行。查看上面的代码结构,您可以看到Python错误处理中的“else”与“if-else”构造几乎相同
为了展示“else”是如何工作的,我们可以稍微修改上一节中算术脚本的代码。如果您查看脚本,您会看到我们使用算术表达式计算了“result”的变量值。您可以将其移动到“else”块,而不是将其放在“try”块中。这样,异常会阻止在将输入值转换为整数时引发的任何错误。如果没有异常,“else”块将执行实际计算:
num0 = 10
try:
num1 = int(input("Enter 1st number:"))
num2 = int(input("Enter 2nd number:"))
except ValueError as ve:
print(ve)
exit()
except ZeroDivisionError as zde:
print(zde)
exit()
except TypeError as te:
print(te)
exit()
except:
print('Unexpected Error!')
exit()
else:
result = (num1 * num2)/(num0 * num2)
print (result)
使用简单的整数作为输入值运行“else”块代码:
Enter 1st number:2
Enter 2nd number:3
0.2
使用空值、十进制数或字符串等错误数据会导致相应的“except”块运行并跳过“else”块:
Enter 1st number:s
invalid literal for int() with base 10: 's'
Enter 1st number:20
Enter 2nd number:
invalid literal for int() with base 10: ''
Enter 1st number:5
Enter 2nd number:6.4
invalid literal for int() with base 10: '6.4'
但是,当“else”块运行时,仍有可能出现未处理的异常:
Enter 1st number:1
Enter 2nd number:0
Traceback (most recent call last):
File "test.py", line 19, in
result = (num1 * num2)/(num0 * num2)
ZeroDivisionError: division by zero
如您所见,两个输入都是整数(1 和 0),并且“try”块成功地将它们转换为整数。当“else”块运行时,我们会看到异常。
那么如何处理“else”块中的错误呢?你猜对了——你可以在外部的“else”块中使用另一个“try-except-else”块:
Enter 1st number:1
Enter 2nd number:0
division by zero
使用 Try-Except-Else-Finally 捕获 Python 异常
Python错误处理中的最后一个可选块。它的字面意思是“终于”:
...
try:
<--program code-->
except <--Exception Type 1-->:
<--exception handling code-->
except <--Exception Type 2-->:
<--exception handling code-->
except <-->Exception Type 3-->>:
<--exception handling code-->
...
else:
<--program code to run if "try" block doesn't encounter any error-->
finally:
<--program code that runs regardless of errors in the "try" or "else" block-->
无论“try”块的代码是否引发异常,“finally”块都会运行。如果出现异常,将运行相应“except”块中的代码,然后运行“finally”块中的代码。如果没有异常,“else”块中的代码将运行(如果有“else”块),然后“finally”块中的代码将运行。
由于“finally”块中的代码始终运行,因此您希望在此处保留“清理”代码,下面是一个使用“finally”的例子:
try:
f = open("testfile.txt", 'r')
except FileNotFoundError as fne:
print(fne)
print ('Creating file...')
f = open("testfile.txt", 'w')
f.write('2')
else:
data=f.readline(1)
print(data)
finally:
print ('Closing file')
f.close()
在这里,“try”块尝试打开一个文件进行读取。如果文件不存在,异常块会显示一条警告消息,创建文件,并向其添加静态值“2”。如果文件存在,“else”块读取其内容的第一行并将其打印出来。最后,“finally”块关闭文件。无论文件最初是否存在,都会发生这种情况。
Python捕获特定异常
一个 try 语句可以有多个 except 子句,为不同的Python错误处理指定处理程序。请注意,最多会执行一个处理程序。比如我们可以在上面的代码中添加IndexError。添加特定异常的一般语法是——
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)
except ZeroDivisionError:
print("ZeroDivisionError Occurred and Handled")
except NameError:
print("NameError Occurred and Handled")
输出:
ZeroDivisionError Occurred and Handled
Python内置异常
Python错误处理有多种类型,类型作为消息的一部分打印,打印为异常类型的错误字符串都是 Python 内置异常的名称。错误行的其余部分根据异常类型提供了导致错误的详细信息。现在让我们看看Python的内置异常
总结
以上是晓得博客为你介绍的Python错误处理的全部内容,在看到语法错误和异常之间的区别后,了解了在 Python 中引发、捕获和处理异常的各种方法。希望本文能帮助您了解 Python 在处理异常时必须提供的工具。
Claude、Netflix、Midjourney、ChatGPT Plus、PS、Disney、Youtube、Office 365、多邻国Plus账号购买,ChatGPT API购买,优惠码XDBK,用户购买的时候输入优惠码可以打95折