Python提供了两个非常重要的功能来处理Python程序中的任何意外错误并在其中添加调试功能 :
异常处理 : 这将在本教程中介绍.以下是Python中可用的列表标准异常:标准例外.
断言 : 这将在 Python中的断言教程中介绍.
标准例外列表 :
Sr.No. | 例外名称&说明 |
---|---|
1 | Exception 所有例外的基类 |
2 | StopIteration 迭代器的next()方法时引发不指向任何对象. |
3 | SystemExit 由sys.exit()函数引发. |
4 | StandardError 除StopIteration和SystemExit之外的所有内置异常的基类. |
5 | ArithmeticError 数值计算发生的所有错误的基类. |
6 | OverflowError 当计算超过数字类型的最大限制时触发. |
7 | FloatingPointError 浮点计算失败时引发. |
8 | ZeroDivisionError 当所有数字类型的除法或模数为零时引发. |
9 | AssertionError 在Assert语句失败的情况下引发. |
10 | AttributeError 在属性引用或赋值失败的情况下引发. |
11 | EOFError 当raw_input()或input()函数没有输入并且到达文件末尾时引发. |
12 | ImportError 导入语句失败时触发. |
13 | KeyboardInterrupt 当用户中断程序执行时引发,通常按Ctrl + c. |
14 | LookupError 所有查找错误的基类. |
15 | IndexError 在序列中找不到索引时引发. |
16 | KeyError 在词典中找不到指定的键时触发. |
17 | NameError 在本地或全局命名空间中找不到标识符时引发. |
18 | UnboundLocalError 尝试时提高访问函数或方法中的局部变量,但没有赋值给它. |
19 | EnvironmentError 在Python环境之外发生的所有异常的基类. |
20 | IOError 当输入/输出操作失败时引发,例如print语句或尝试打开不存在的文件时的open()函数. |
21 | IOError 引发与操作系统相关的错误. |
22 | SyntaxError 当Python语法出错时引发. |
23 | IndentationError 未正确指定缩进时触发. |
24 | SystemError 当解释器找到内部pr时引发oblem,但是当遇到这个错误时,Python解释器不会退出. |
25 | SystemExit 使用sys.exit()函数退出Python解释器时引发.如果未在代码中处理,则导致解释器退出. |
26 | TypeError 尝试对指定数据类型无效的操作或函数时触发. |
27 | ValueError 当数据类型的内置函数具有有效的参数类型但参数指定了无效值时引发. |
28 | RuntimeError 当生成的错误不属于任何类别时引发. |
29 | NotImplementedError 当抽象方法出现时需要在继承的类中实现,实际上并没有实现. |
Python中的断言
断言是一种可以打开的理智检查或者在完成程序测试后关闭.
想到断言的最简单方法是将其比作 raise-if 语句(或者更确切地说,如果没有加薪声明).测试表达式,如果结果为false,则引发异常.
断言由断言语句执行,断言语句是Python的最新关键字,在1.5版本中引入./p>
程序员经常在函数开头放置断言来检查有效输入,并在函数调用后检查有效输出.
assert Statement
当遇到断言语句时,Python会对伴随的表达式求值,这有望成为现实.如果表达式为false,则Python引发 AssertionError 异常.
断言的语法是 :
assert Expression [,Arguments]
如果断言失败,Python使用ArgumentExpression作为参数对于AssertionError.可以使用try-except语句像任何其他异常一样捕获和处理AssertionError异常,但如果不处理,它们将终止程序并产生回溯.
示例
这是一个将温度从开尔文转换为华氏度的函数.由于零度开尔文和它一样冷,如果它看到负温度和负值,函数就会失效;
#!/usr/bin/pythondef KelvinToFahrenheit(Temperature): assert (Temperature >= 0),"Colder than absolute zero!" return ((Temperature-273)*1.8)+32print KelvinToFahrenheit(273)print int(KelvinToFahrenheit(505.78))print KelvinToFahrenheit(-5)
执行上述代码时,会产生以下结果 :
32.0451Traceback (most recent call last):File "test.py", line 9, inprint KelvinToFahrenheit(-5)File "test.py", line 4, in KelvinToFahrenheitassert (Temperature >= 0),"Colder than absolute zero!"AssertionError: Colder than absolute zero!
什么是异常?
异常是一个事件,在执行一个扰乱了程序指令的正常流程.通常,当Python脚本遇到无法处理的情况时,会引发异常.异常是表示错误的Python对象.
当Python脚本引发异常时,它必须立即处理异常,否则它将终止并退出.
处理异常
如果您有一些可能引发异常的可疑代码,您可以通过将可疑代码放入
语法
以下是尝试的简单语法....除了......其他块 :
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:block中的代码没有引发异常,则执行else-block中的代码.
else-block是代码的好地方这不需要try:block的保护.
示例
此示例打开一个文件,在文件中写入内容并优雅地出来,因为根本没有问题:
#!/usr/bin/pythontry: 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/pythontry: 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语句虽然不被认为是一种很好的编程习惯,因为它捕获了所有异常但却没有让程序员找出可能发生的问题的根本原因.
除了具有多个异常的子句
您还可以使用相同的除语句来处理多个异常,如下所示 :
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 Clause
您可以使用 finally:块以及a 尝试:块. finally块是放置必须执行的任何代码的地方,无论try-block
是否引发了异常. 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/pythontry: 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/pythontry: 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 语句.
异常的参数
异常可以有参数,这是提供有关问题的其他信息的值.参数的内容因异常而异.您通过在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 numbersinvalid literal for int() with base 10: 'xyz'
提高例外
您可以使用raise语句以多种方式引发异常. raise 语句的一般语法如下.
语法
raise [Exception [, args [, traceback]]]
这里, Exception 是异常的类型(例如, NameError)和参数是异常参数的值.参数是可选的;如果没有提供,则异常参数为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