Python提供了两个非常重要的功能,以处理在Python程序任何异常错误,并增加调试功能:
-
异常处理:这将包括在本教程中。这是在Python中可用列表标准异常:标准异常 。
-
断言:这将Python断言教程中介绍。
什么是异常?
异常是一个事件,其中一个程序,破坏程序的指令的正常流的执行过程中而发生的。一般情况下,当一个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语句可以有多个不同的语句。当try块中包含可能会引发不同类型的异常语句,这是很有用的。
-
也可以提供一个通用的except子句,它用来处理任何异常。
-
except子句后,可以包括其他子句。块没有引发异常:在别的块中的代码,如果在try中的代码执行。
-
在else块是不需要try:块的代码的保护。
例子:
这里是简单的例子,这将打开一个文件并写入内容的文件中并移出正常:
#!/usr/bin/python
import os
import subprocess
#创建一个文件
os.mkdir("F:\\pythonDEV\\简明python笔记\\异常处理\\File2")
#切换到当前文件夹
os.chdir("F:\\pythonDEV\\简明python笔记\\异常处理\\File2")
print(os.getcwd())
#创建一个txt1.txt,内容为Hello LinKen!
def txt_create(name,meg):
desktop_path = "F:\\pythonDEV\\简明python笔记\\异常处理\\File2\\"
full_path = desktop_path + name + '.txt'
file = open(full_path,'w')
file.write(meg)
txt_create('txt1','Hello world!')
#打开一个文件并写入内容的文件中并移出正常
try:
fo = open("txt1.txt","w")
fo.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")
fo.close()
执行上面程序,返回下面结果:
F:\pythonDEV\简明python笔记\异常处理\File2
Written content in the file successfully
例子:
这里有一个更简单的例子,它试图打开没有权限并在文件中写入内容,所以它会引发一个异常:
#!/usr/bin/python
import os
os.chdir("F:\\pythonDEV\\简明python笔记\\异常处理\\File2")
print (os.getcwd())
try:
fh = open("txt1.txt","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")
执行上面程序,返回下面结果:
F:\pythonDEV\简明python笔记\异常处理\File2
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-finally语句的预发是这样的:
try:
you do your operations here; #你在这里进行操作
Due to any exception,this may be skipped. 由于任何例外,可能会跳过。
finally:
This would always be executed. 这将始终执行。
请注意,可以提供except子句或finally子句,但不能同时使用,不能同时使用else子句与finally子句。
例子:
#!/usr/bin/python
import os
os.chdir("F:\\pythonDEV\\简明python笔记\\异常处理\\File2")
print (os.getcwd())
try:
fh = open("txt1.txt","r+")
fh.write("This is my test file for exception handling!!")
finally:
print ("Error: can't find file or read data")
执行上面程序,返回下面结果:
F:\pythonDEV\简明python笔记\异常处理\File2
Error: can't find file or read data
同样的例子可以写入更简洁,如下所示:
#!/usr/bin/python
try:
fh = open("testfile.txt","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语句。
Exception参数:
异常可以有一个参数,参数是一个值,它给出了关于这个问题的其他信息,参数按异常内容改变,可以通过不同的子句提供一个变量,如下所示捕获异常的参数:
try:
You do your operations here; #您在这里进行操作
......................
except ExceptionType, Argument:
You can print value of Argument here... #您可以在此处打印Argument的值
示例:
下面是一个异常的例子:
#!/usr/bin/python
#Define a function here.
def temp_convert(var):
try:
return int(var):
except ValueError,Argument:
print("The argument does not contain numbersn",Argument)
#Call above function here.
temp_conver("xyz");
执行上面程序,返回下面结果:
The argument does not contain numbersn
抛出异常:
可以通过通用raise语句抛出几个方面的异常,一般的raise语句的语法。
语法:
raise[Exception[,args[,traceback]]]
这里,Exception是异常的类型(例如,NameError)和参数是用于异常的参数值。该参数是可选的,如果未提供,则异常的参数是None.最后一个参数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可用的标准异常:
异常名称 | 描述 |
---|---|
Exception | 所有异常的基类 |
StopIteration | 当引发一个迭代器的next()方法不指向任何对象。 |
SystemExit | 由sys.exit()函数引发。 |
StandardError | 基类,except 停止迭代和系统退出所有内置异常。 |
ArithmeticError | 基类中出现的数值计算的所有错误。 |
OverflowError | 当计算超过了最大限制为数字类型引发。 |
FloatingPointError | 当一个浮点运算失败时触发。 |
ZeroDivisonError | 当除法或模零发生的所有数值类型引发。 |
AssertionError | 引发当assert语句失败。 |
AttributeError | 引发在属性引用或赋值失败。 |
EOFError | 引发当没有从任一进行输入raw_input()或input()函数和文件的结束为止。 |
ImportError | 当一个import语句失败时触发。 |
KeyboardInterrupt | 引发当用户按下中断程序执行,通常是Ctrl+c. |
LookupError | 所有查找错误基类。 |
IndexError | 当在一个序列中没有发现的索引引发。 |
KeyError | 如果在字典中找不到指定的键触发。 |
NameError | 当在局部或全局命名空间是没有找到一个标识符引发。 |
UnboundLocalError | 试图访问在函数或方法的局部变量时引发但没有值已被分配给它。 |
EnvironmentError | Python环境以外发生的所有异常的基类。 |
IOError | 当试图打开一个不存在的文件时,输入/输出操作失败,如打印语句或open()函数引发。 |
OSError | 触发当出现操作系统相关的错误。 |
SyntaxError | Python语法错误引发。 |
IndentationError | 没有正确指定缩进引发。 |
SystemError | 翻译时发现内部问题,但是当遇到此错误Python解释器不会退出引发。 |
SystemExit | 当Python解释器通过使用sys.exit()函数退出时触发。如果在代码中没有处理好,导致解释器退出。 |
TypeError | 当操作或功能的尝试是用于指定数据类型无效时触发。 |
ValueError | 触发当内置函数的数据类型参数的有效类型,但参数指定的值无效。 |
RuntimeError | 触发当一个生成的错误不属于任何类别。 |
NotImplementedError | 触发当继承的类来实现,需要一个抽象方法实际上并没有实现。 |
断言:这将Python断言教程中介绍:
断言是一个理智检查,可以打开或关闭在程序做测试时。
断言的最简单的方法是将其比喻为触发-if语句(或者更准确,触发,如果未声明)。一个表达式进行测试,如果结果出现false,将引发异常。
断言是由assert语句,最新的关键字是Python版本1.5引入的。
程序员常常放置在一个函数来检查的有效输入开始断言和函数调用后检查有效输出。
assert语句:
当它遇到一个assert语句,Python计算表达式。如果表达式为false,Python会引发一个AssertionError异常。
断言的语法是:
assert Expression[,Arguments]
例子:
这里是一个函数,它把来自开氏度到华氏温度的温度下。自零开氏度是因为它得到寒冷,如果它看到一个负温度函数退出:
#!/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
Traceback (most recent call last):
451
File "F:/pythonDEV/简明python笔记/异常处理/异常的例子/自零开氏度到一个负温度函数退出.py", line 7, in <module>
print (KelvinToFahrenheit(-5))
File "F:/pythonDEV/简明python笔记/异常处理/异常的例子/自零开氏度到一个负温度函数退出.py", line 3, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!