Python - 异常处理
上一页下一页
Python 提供了两个非常重要的功能来处理 Python 程序中的任何意外错误并在其中添加调试功能 -
-
异常处理 - 这将在本教程中介绍。以下是 Python 中可用的标准异常列表:标准异常。
-
断言 − 这将在 Python 中的断言教程中介绍。
标准例外列表 -
Sr.No. | 异常名称和描述 |
---|---|
1 | 例外 所有异常的基类 |
2 | 停止迭代 当迭代器的 next() 方法不指向任何对象时引发。 |
3 | 系统退出 由 sys.exit() 函数引发。 |
4 | 标准错误 除 StopIteration 和 SystemExit 之外的所有内置异常的基类。 |
5 | 算术错误 数值计算发生的所有错误的基类。 |
6 | 溢出错误 当计算超出数值类型的最大限制时引发。 |
7 | 浮点错误 浮点计算失败时引发。 |
8 | ZeroDivisionError 当所有数值类型发生除零或模零时引发。 |
9 | 断言错误 在 Assert 语句失败的情况下引发。 |
10 | 属性错误 在属性引用或分配失败的情况下引发。 |
11 | EOF错误 当 raw_input() 或 input() 函数没有输入并且到达文件末尾时引发。 |
12 | 导入错误 导入语句失败时引发。 |
13 | 键盘中断 当用户中断程序执行时引发,通常通过按 Ctrl+c。 |
14 | 查找错误 所有查找错误的基类。 |
15 | 索引错误 在序列中未找到索引时引发。 |
16 | 密钥错误 在字典中找不到指定的键时引发。 |
17 | 名称错误 在本地或全局命名空间中找不到标识符时引发。 |
18 | UnboundLocalError 尝试访问函数或方法中的局部变量但未为其分配值时引发。 |
19 | 环境错误 发生在 Python 环境之外的所有异常的基类。 |
20 | IO错误 当输入/输出操作失败时引发,例如 print 语句或试图打开不存在的文件时的 open() 函数。 |
21 | IO错误 引发与操作系统相关的错误。 |
22 | 语法错误 当 Python 语法出现错误时引发。 |
23 | 缩进错误 未正确指定缩进时引发。 |
24 | 系统错误 当解释器发现内部问题时引发,但遇到此错误时 Python 解释器不会退出。 |
25 | 系统退出 当使用 sys.exit() 函数退出 Python 解释器时引发。如果没有在代码中处理,导致解释器退出。 |
26 | 类型错误 当尝试对指定数据类型无效的操作或函数时引发。 |
27 | 值错误 当数据类型的内置函数具有有效的参数类型,但参数指定的值无效时引发。 |
28 | 运行时错误 当生成的错误不属于任何类别时引发。 |
29 | NotImplementedError 当需要在继承类中实现的抽象方法没有实际实现时引发。 |
Python 中的断言
断言是一种健全性检查,您可以在完成程序测试后打开或关闭它。
考虑断言的最简单方法是将其比作 raise-if 声明(或者更准确地说,一个 raise-if-not 声明)。测试表达式,如果结果为假,则引发异常。
断言由 assert 语句执行,这是 Python 的最新关键字,在 1.5 版本中引入。
程序员经常在函数开头放置断言来检查输入是否有效,并在函数调用之后放置断言来检查输出是否有效。
断言 声明
当遇到断言语句时,Python 会计算伴随的表达式,希望这是真的。如果表达式为假,Python 会引发 AssertionError 例外。
语法 对于断言是 -
assert Expression[, Arguments]
如果断言失败,Python 使用 ArgumentExpression 作为 AssertionError 的参数。 AssertionError 异常可以像任何其他异常一样使用 try-except 语句捕获和处理,但如果不处理,它们将终止程序并产生回溯。
示例
这是一个将温度从开尔文度转换为华氏度的函数。由于开氏零度的温度非常低,因此如果看到负温度,该函数就会退出 -
现场演示#!/usr/bin/python def KelvinToFahrenheit(Temperature): assert (Temperature >= 0),"Colder than absolute zero!" return ((Temperature-273)*1.8)+32 print KelvinToFahrenheit(273) print int(KelvinToFahrenheit(505.78)) print KelvinToFahrenheit(-5)
执行上述代码时,会产生以下结果 -
32.0 451 Traceback (most recent call last): File "test.py", line 9, in <module> print KelvinToFahrenheit(-5) File "test.py", line 4, in KelvinToFahrenheit assert (Temperature >= 0),"Colder than absolute zero!" AssertionError: Colder than absolute zero!
什么是异常?
异常是在程序执行期间发生的事件,它破坏了程序指令的正常流程。通常,当 Python 脚本遇到无法应对的情况时,它会引发异常。异常是表示错误的 Python 对象。
当 Python 脚本引发异常时,它必须要么立即处理异常,要么终止并退出。
处理异常
如果你有一些可疑的 可能引发异常的代码,您可以通过将可疑代码放在 try: 中来保护您的程序 堵塞。在 try:块之后,包含一个 except: 语句,后跟一段代码,尽可能优雅地处理问题。
语法
这是 try....except...else 的简单语法 块 -
try: You do your operations here; ...................... except ExceptionI: If there is ExceptionI, then execute this block. except ExceptionII: If there is ExceptionII, then execute this block. ...................... else: If there is no exception then execute this block.
以下是关于上述语法的几个要点 -
-
一个 try 语句可以有多个 except 语句。当 try 块包含可能抛出不同类型异常的语句时,这很有用。
-
您还可以提供一个通用的 except 子句,它可以处理任何异常。
-
在 except 子句之后,您可以包含一个 else 子句。如果 try:块中的代码没有引发异常,则执行 else 块中的代码。
-
else-block 是放置不需要 try:块保护的代码的好地方。
示例
这个例子打开一个文件,在文件中写入内容,然后优雅地出来,因为完全没有问题 -
现场演示#!/usr/bin/python try: fh = open("testfile", "w") fh.write("This is my test file for exception handling!!") except IOError: print "Error: can\'t find file or read data" else: print "Written content in the file successfully" fh.close()
这会产生以下结果 -
Written content in the file successfully
示例
这个例子试图打开一个你没有写权限的文件,所以它引发了一个异常 -
现场演示#!/usr/bin/python try: fh = open("testfile", "r") fh.write("This is my test file for exception handling!!") except IOError: print "Error: can\'t find file or read data" else: print "Written content in the file successfully"
这会产生以下结果 -
Error: can't find file or read data
除了 无例外条款
您也可以使用 except 语句,没有异常定义如下 -
try: You do your operations here; ...................... except: If there is any exception, then execute this block. ...................... else: If there is no exception then execute this block.
这种try-except 语句捕获所有发生的异常。但是,使用这种 try-except 语句并不被认为是一种好的编程习惯,因为它会捕获所有异常,但不会让程序员找出可能发生的问题的根本原因。
除了 有多个例外的子句
您也可以使用相同的 except 处理多个异常的语句如下 -
try: You do your operations here; ...................... except(Exception1[, Exception2[,...ExceptionN]]]): If there is any exception from the given exception list, then execute this block. ...................... else: If there is no exception then execute this block.
try-finally 子句
你可以使用 finally: 与 try: 一起阻止 堵塞。 finally 块是放置任何必须执行的代码的地方,无论 try 块是否引发异常。 try-finally 语句的语法是这样的 -
try: You do your operations here; ...................... Due to any exception, this may be skipped. finally: This would always be executed. ......................
您不能使用 else 子句以及 finally 子句。
示例
现场演示#!/usr/bin/python try: fh = open("testfile", "w") fh.write("This is my test file for exception handling!!") finally: print "Error: can\'t find file or read data"
如果您没有权限以写入模式打开文件,则会产生以下结果 -
Error: can't find file or read data
同样的例子可以写得更干净,如下 -
现场演示#!/usr/bin/python try: fh = open("testfile", "w") try: fh.write("This is my test file for exception handling!!") finally: print "Going to close the file" fh.close() except IOError: print "Error: can\'t find file or read data"
当 try 中抛出异常时 块,执行立即传递到finally 堵塞。在 finally 中的所有语句之后 块被执行,再次引发异常并在 except 中处理 语句如果存在于 try-except 的下一个更高层中 声明。
异常参数
异常可以有一个参数 ,这是一个提供有关问题的附加信息的值。参数的内容因例外而异。您可以通过在 except 子句中提供一个变量来捕获异常的参数,如下所示 -
try: You do your operations here; ...................... except ExceptionType, Argument: You can print value of Argument here...
如果您编写代码来处理单个异常,则可以在 except 语句中的异常名称后面添加一个变量。如果要捕获多个异常,可以在异常元组后面加上一个变量。
这个变量接收异常的值,主要包含异常的原因。变量可以接收单个值或元组形式的多个值。该元组通常包含错误字符串、错误编号和错误位置。
示例
以下是单个异常的示例 -
现场演示#!/usr/bin/python # Define a function here. def temp_convert(var): try: return int(var) except ValueError, Argument: print "The argument does not contain numbers\n", Argument # Call above function here. temp_convert("xyz");
这会产生以下结果 -
The argument does not contain numbers invalid literal for int() with base 10: 'xyz'
引发异常
您可以使用 raise 语句以多种方式引发异常。 raise 的一般语法 声明如下。
语法
raise [Exception [, args [, traceback]]]
在这里,异常 是异常的类型(例如,NameError)和 argument 是异常参数的值。参数是可选的;如果未提供,则异常参数为 None。
最后一个参数 traceback 也是可选的(在实践中很少使用),如果存在,则是用于异常的 traceback 对象。
示例
异常可以是字符串、类或对象。 Python 核心引发的大多数异常都是类,其参数是类的实例。定义新的异常非常简单,可以按如下方式完成 -
def functionName( level ): if level < 1: raise "Invalid level!", level # The code below to this would not be executed # if we raise the exception
注意: 为了捕获异常,“except”子句必须引用类对象或简单字符串引发的相同异常。例如,要捕获上述异常,我们必须将 except 子句编写如下 -
try: Business Logic here... except "Invalid level!": Exception handling here... else: Rest of the code here...
用户定义的异常
Python 还允许您通过从标准内置异常派生类来创建自己的异常。
这是一个与 RuntimeError 相关的示例 .在这里,创建了一个从 RuntimeError 继承的类 .当您需要在捕获到异常时显示更具体的信息时,这很有用。
在 try 块中,引发用户定义的异常并在 except 块中捕获。变量 e 用于创建类 Networkerror 的实例 .
class Networkerror(RuntimeError): def __init__(self, arg): self.args = arg
所以一旦你定义了上面的类,你可以引发如下异常 -
try: raise Networkerror("Bad hostname") except Networkerror,e: print e.args
Python