python错误处理

Python错误处理

Python错误处理

  Python 有许多内置异常,当您的程序遇到错误(程序中出现错误)时会引发这些异常。当这些异常发生时,Python 解释器会停止当前进程并将其传递给调用进程,直到它被处理。如果不处理,程序将崩溃。例如,让我们考虑一个程序,我们有一个功能 A是调用函数B,进而调用功能C。如果函数中发生异常C但未在 中处理C,则异常传递到B,然后传递到A。

python异常处理

  如果从未处理过,则会显示一条错误消息,我们的程序会突然意外停止。Python中的错误可以有两种类型,即语法错误和异常。错误是程序中导致程序停止执行的问题。另一方面,当发生一些改变程序正常流程的内部事件时,会引发异常。本文晓得博客为你介绍Python错误处理方式。

  推荐:使用Python截取屏幕截图的3种方法

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 异常

使用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 中引发、捕获和处理异常的各种方法。希望本文能帮助您了解 Python 在处理异常时必须提供的工具。

  推荐:零基础如何开始学习Python


晓得博客,版权所有丨如未注明,均为原创
晓得博客 » Python错误处理

转载请保留链接:https://www.pythonthree.com/python-error-handling/

滚动至顶部