python异常理解

  • 什么是异常:

a、 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。
b、一般情况下,在Python无法正常处理程序时就会发生一个异常。
c、异常是Python对象,表示一个错误。
d、当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。
e、Exception is as a sort of structured “super go to”.
异常是一种结构化的"超级goto".超级goto很有意思;浪里白条goto

  • 为什么使用异常:

因为一旦有异常发生,运行Python代码的控制权就会立即跳转到相应的异常处理程序。再者,因为Python解释器会自动检查错误,所以Python代码通常不需要事先检查错误。归根结底一句话,异常(Exception)让程序员大致上可以忽略罕见的情况,并避免编写那些(烦人的但又不得不写的)错误检查代码。

  • 异常充当的角色:

Error handling 错误处理
Event notification 事件通知
Special-case handling 特殊情况处理
Termination actions 行为终止
Unusual control flows 非常规控制流

  • 异常处理的常见结构:

1、默认异常处理器
当我们的代码没有刻意去捕获某个异常的时候,一旦有致命错误发生,解释器将启动默认的异常处理器。

2、捕捉异常
很多时候,我们并不希望执行默认的异常行为,而是即便异常发生之后,我们的代码还能继续运行下去。这样,我们可以自己捕获异常。
以下为简单的try…except…else的语法:

try:
<语句>        #运行别的代码
except <名字>:
<语句>        #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句>        #如果引发了'name'异常,获得附加的数据
else:
<语句>        #如果没有异常发生

下面是简单的例子,它打开一个文件,在该文件中的内容写入内容,但文件没有写入权限,发生了异常:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
    fh = open("testfile", "w")
    fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
    print "Error: 没有找到文件或读取文件失败"
else:
    print "内容写入文件成功"
    fh.close()

输出结果:

$ python test.py 
Error: 没有找到文件或读取文件失败

try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。

a、如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
b、如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。
c、如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。

3、使用except而带多种异常类型
你也可以使用相同的except语句来处理多个异常信息,如下所示:

try:
    正常的操作
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   发生以上多个异常中的一个,执行这块代码
   ......................
else:
    如果没有异常执行这块代码

4、异常的参数:
一个异常可以带上参数,可作为输出的异常信息参数。
你可以通过except语句来捕获异常的参数,如下所示:

try:
    正常的操作
   ......................
except ExceptionType, Argument:
    你可以在这输出 Argument 的值...

变量接收的异常值通常包含在异常的语句中。在元组的表单中变量可以接收一个或者多个值。
元组通常包含错误字符串,错误数字,错误位置。
实例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 定义函数
def temp_convert(var):
    try:
        return int(var)
    except ValueError, Argument:
        print "参数没有包含数字\n", Argument

# 调用函数
temp_convert("xyz");

输出结果:

$ python test.py 
参数没有包含数字
invalid literal for int() with base 10: 'xyz'

5、无条件触发异常(raise):
我们可以使用raise语句自己触发异常

raise Exception (args , traceback)
或raise Exception,agrs

语句中 Exception 是异常的类型(例如,NameError)参数标准异常中任一种,args 是自已提供的异常参数。
最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象。
实例:
一个异常可以是一个字符串,类或对象。 Python的内核提供的异常,大多数都是实例化的类;
注意:为了能够捕获异常,"except"语句必须有用相同的异常来抛出类对象或者字符串。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 定义函数
def mye( level ):
    if level < 1:
        raise Exception,"Invalid level!"
        # 触发异常后,后面的代码就不会再执行
try:
    mye(0)            # 触发异常
except Exception,err:
    print 1,err
else:
    print 2

输出结果:

$ python test.py 
1 Invalid level!

6、自定义异常:
a、 通过创建一个新的异常类,程序可以命名它们自己的异常。异常应该是典型的继承自Exception类,通过直接或间接的方式。
b、以下为与RuntimeError相关的实例,实例中创建了一个类,基类为RuntimeError,用于在异常触发时输出更多的信息。
c、在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

7、终止行为finally:
最后,try语句可以说"finally"。也就是说,它可以包含finally代码块。这看上去就像异常的except处理器,但是try/finally组合,可以定义一定会在最后执行时的收尾行为,无论try代码块是否发生了异常;无论有没有异常发生,都会执行finally子句。

猜你喜欢

转载自blog.csdn.net/qq_33706146/article/details/85101740