Python 异常处理总结_python_脚本之家
https://www.jb51.net/article/223826.htm
异常处理对于创建健壮和稳定的应用程序非常重要。它鼓励程序员编写干净、可读和无错误的代码。
您会同意,即使是最好的代码也可能在运行时出现意外行为。这可能是由于缺少配置,或者执行环境发生了变化,或者用户输入了错误的输入。
其中一些错误可能会导致程序突然终止。在 Python
异常处理的帮助下,我们可以管理上述问题并避免我们的代码间歇性失败。
首先,我们必须了解错误和异常之间的区别。因此,我们将教您 Python
异常处理的基本知识。
错误是程序中出现的错误,例如语法错误。
它发生在编译时。让我们看一个例子。
1 2 3 4 5 |
if a< 5
File "<interactive input>" , line 1
if a < 5
^
SyntaxError: invalid syntax
|
错误也会在运行时发生,我们将它们称为异常。异常是在程序执行期间发生并中断程序指令正常流程的事件。
通常,当 Python
脚本遇到它无法处理的错误情况时,它会引发异常。
当 Python
脚本引发异常时,它会创建一个异常对象。
通常,脚本会立即处理异常。如果它不这样做,那么程序将终止并打印对错误的追溯及其下落。
1 2 3 4 5 |
>>> 1 / 0
Traceback (most recent call last):
File "<string>" , line 301 , in run code
File "<interactive input>" , line 1 , in <module>
ZeroDivisionError: division by zero
|
我们使用 try-except
语句在 Python
程序中启用异常处理。
在 try
块中,您编写可以引发异常的代码。
而处理或捕获异常的代码,我们放在except
子句中。
以下是Python try-except-else
块的语法。
1 2 3 4 5 6 7 8 9 10 |
try :
你在这里做你的操作;
......................
except ExceptionI:
如果有 ExceptionI,则执行此块
except ExceptionII:
如果有 ExceptionII,则执行此块
......................
else :
如果没有异常则执行此块。
|
看一看 – 30 个 Python 教程和技巧
这是有效使用 Python try
语句的清单。
try
语句可以有多个 except
语句。在这种情况下,try
块包含可以抛出不同类型异常的语句。except
子句,它可以处理所有可能的异常类型。except
子句之后包含一个else
子句。如果 try
块中的代码没有引发异常,则 else 块中的指令将执行。让我们通过一个示例代码来了解 Python try-except
的使用。
1 2 3 4 5 6 7 8 9 10 |
try :
fob = open ( "test" , "w" )
fob.write( "这是我的异常处理测试文件" )
except IOError:
print
"错误:找不到文件或读取数据"
else :
print
"对文件执行写操作成功"
fob.close()
|
上面的代码产生以下输出。
>>对文件执行写操作成功
让我们再举一个例子,在这个例子中我们试图以 READ 模式打开一个文件。
我们将对其执行 WRITE 操作。执行时会抛出异常。
1 2 3 4 5 6 7 8 9 |
try :
fob = open ( "test" , "r" )
fob.write( "这是我的测试文件,用于验证 Python 中的异常处理" )
except IOError:
print
"错误:找不到文件或读取数据"
else :
print
"对文件执行写操作成功"
|
上面的代码产生以下输出。
>>错误:找不到文件或读取数据
如果我们使用一个空的 “except
” 子句,那么它将捕获所有类型的异常。
然而,这既不是一个好的编程习惯,也没有人推荐它。
这是因为这样的 Python try-except
块可以处理所有类型的异常。但是它不会帮助程序员找到导致问题的异常。
您可以通过以下代码查看如何捕获所有异常。
1 2 3 4 5 6 7 8 |
try :
你在这里做你的操作;
......................
except :
如果有任何异常,则执行此块
......................
else :
如果没有异常则执行此块
|
我们可以使用相同的 except
子句定义多个异常。这意味着如果 Python
解释器找到匹配的异常,那么它将执行在 except
子句下编写的代码。
简而言之,当我们这样定义except
子句时,我们期望同一段代码抛出不同的异常。此外,我们希望在每种情况下都采取相同的行动。
请参考下面的例子。
1 2 3 4 5 6 7 8 9 |
try :
你在这里做你的操作;
......................
except (Exception1[, Exception2[,...ExceptionN]]]):
如果给定的异常列表中有任何异常,
然后执行这个块
......................
else :
如果没有异常则执行此块
|
我们还可以借助 try-finally
语句启用 Python
异常处理。
使用 try
块,我们还可以选择定义“ finally
”块。该子句允许定义我们想要执行的语句,无论 try 块是否引发异常。
此功能通常在释放外部资源时出现。
这是帮助的编码片段。
1 2 3 4 5 6 7 |
try :
你在这里做你的操作;
......................
由于任何异常,这可能会被跳过
finally :
这将始终被执行
......................
|
一个关键点是我们可以为每个 try 块定义一个“ except
”或“ finally
”子句。你不能把这些放在一起。此外,您不应将“ else ”子句与“ finally
”子句一起使用。
让我们举一个例子来更清楚。
1 2 3 4 5 6 7 |
try :
fob = open ( 'test' , 'w' )
fob.write( "这是我在异常处理中验证 try-finally 的测试文件" )
print 'try 块执行'
finally :
fob.close()
print 'finally 块执行'
|
如果未发生异常,则您将看到以下输出。
>>try 块执行
>>finally 块执行
假设我们以READ模式打开文件,然后尝试对其执行写操作。在这种情况下,下面的代码将有助于处理异常。
1 2 3 4 5 6 7 8 9 10 |
try :
fob = open ( 'test' , 'r' )
try :
fob.write( "这是我在异常处理中验证 try-finally 的测试文件" )
print 'try 块执行'
finally :
fob.close()
print 'finally 块执行以关闭文件'
except IOError:
print "错误:找不到文件或读取数据"
|
在这种情况下,解释器将引发异常,并显示以下输出。
>>finally 块执行以关闭文件
>>错误:找不到文件或读取数据
当某些代码在 try 块中引起异常时,执行会立即传递到“ finally
”块。“ finally
”块中的语句全部执行完毕后,异常恢复到“ except
”块执行。但是必须存在“ try-except
”语句的下一个更高层。
我们可以使用 raise
关键字强制引发异常。
我们还可以选择将值传递给异常并指定它发生的原因。
这是调用“ raise
”方法的语法。
1 |
raise [Exception [, args [, traceback]]]
|
在哪里,
Exception
”下- 指定其名称。args
”是可选的,表示异常参数的值。traceback
” 也是可选的,如果存在,则是用于异常的回溯对象。让我们举一个例子来证明这一点。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
>>> raise MemoryError
Traceback (most recent call last):
...
MemoryError
>>> raise MemoryError( "This is an argument" )
Traceback (most recent call last):
...
MemoryError: This is an argument
>>> try :
a = int ( input ( "Enter a positive integer value: " ))
if a < = 0 :
raise ValueError( "This is not a positive number!!" )
except ValueError as ve:
print (ve)
Following Output is displayed if we enter a negative number:
Enter a positive integer: – 5
This is not a positive number!!
|
自定义异常是程序员自己创建的异常。
他通过添加一个新类来做到这一点。这里的技巧是从基本异常类派生自定义异常类。
大多数内置异常也有相应的类。
1 2 3 4 5 6 7 8 9 10 11 12 |
>>> class UserDefinedError(Exception):
... pass
>>> raise UserDefinedError
Traceback (most recent call last):
...
__main__.UserDefinedError
>>> raise UserDefinedError( "An error occurred" )
Traceback (most recent call last):
...
__main__.UserDefinedError: An error occurred
|
在上面的代码片段中,您可以看到我们创建了一个用户定义的异常类,“ UserDefinedError
” 。它使用基 Exception
类作为父类。因此,新的用户定义异常类将像任何其他异常类一样引发异常,即通过调用带有可选错误消息的“ raise
”语句。
让我们举个例子。
在此示例中,我们将展示如何在程序中引发用户定义的异常并捕获错误。
该程序提示用户一次又一次地输入字母表,直到他只输入存储的字母表为止。
为了寻求帮助,该程序会向用户提供提示,以便他可以找出正确的字母表。此外,他可以检查他的猜测是否高于或低于存储的字母表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#定义 Python 用户定义的异常
class Error(Exception):
"""Base class for other exceptions"""
pass
class InputTooSmallError(Error):
"""Raised when the entered alpahbet is smaller than the actual one"""
pass
class InputTooLargeError(Error):
"""Raised when the entered alpahbet is larger than the actual one"""
pass
#我们的主程序
#用户猜测一个字母,直到他/她猜对了
#你需要猜这个字母
alphabet = 'm'
while True :
try :
apb = input ( "输入一个字母: " )
if apb < alphabet:
raise InputTooSmallError
elif apb > alphabet:
raise InputTooLargeError
break
except InputTooSmallError:
print ( "输入的字母太小,再试一遍!" )
print ('')
except InputTooLargeError:
print ( "输入的字母太大,再试一遍!" )
print ('')
print ( "恭喜! 你猜对了" )
|
让我们通过提供不同的输入来测试这个程序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
输入一个字母:c
输入的字母太小,再试一遍!
输入一个字母:s
输入的字母太大,再试一遍!
输入一个字母:q
输入的字母太大,再试一遍!
输入一个字母:k
输入的字母太小,再试一遍!
输入一个字母:m
恭喜! 你猜对了
|
因此你可以看到我们在这个程序中定义了一个名为 Error 的基类。它引发了从基类派生的两个异常(“ InputTooSmallError
”和“ InputTooLargeError
”)。这是在 Python
编程中定义用户定义异常的标准方法。
大多数时候,我的目标是发现一个可以帮助读者工作的主题。这就是我们介绍本篇关于 Python
异常处理的原因。如果您喜欢这篇文章并有兴趣看到更多此类文章,可以看看这里(Github/Gitee
) 关注我以查看更多信息,这里汇总了我的全部原创及作品源码