异常


异常定义:python运行时出现的错误
一般有两种形式:
    语法错误:软件结构上有错误而导致不能被解释器解释或不能被编译器编译
    逻辑错误:由于不完整或不合法的输入所致,也可能是逻辑无法生成,计算或者输出结果需要的过程无法执行等

python异常是一个对象,表示错误或意外情况
由python检测到一个错误时,将触发一个异常
    python可以通过异常传导机制传递一个异常对象,发出一个异常情况出现的信号
    程序员也可以在代码中手动触发异常
    
python异常也可以理解为:程序出现错误而在正常控制流以外采取的行为
    第一阶段:解释器触发异常,此时当前程序流将被打断
    第二阶段:异常处理,如忽略非致命性错误,减轻错误带来的影响等
    
-----异常的功用--------------------------------------------------------
    python的默认处理:停止程序,打印错误消息
    使用try语句处理异常并从异常中恢复
事件通知:
用于发出有效状态信号

特殊情况处理:
无法调整代码去处理的场景

终止行为:
try/finally语句可确保执行必须的结束处理机制

非常规控制流:
异常是一种高级跳转机制

    
------检测和处理异常-------------------------------------------------
异常通过try语句来检测:
    任何在try语句块里的代码都会被监测,以检查有无异常发生
try语句只要有两种形式:
    try-except:检测和处理异常
        可以有多个except
        支持使用else子句处理没有探测异常的执行的代码
    try-finally:
        仅检测异常并做出去一些必要的清理工作
        仅能有一个finally
    try语句的复合形式:
        try-except-finally    
    
try-except语句
定义了进行异常监控的一段代码,并且提供了处理异常的机制
语法:
    try:
        try_suite
    except Exception[,reason]:
        except_suite
    例子:
    >>>try:
            f1 = open("/tmp/a.txt","r")           前提:/tmp/a.txt没有这个文件
        except IOrror,e:
            print 'Could not open file:',e
        
    could not open file:[Errno 2] No such file or directory:‘/tmp/a.txt’
    
    
try-except-else语句
try语句可以带多个except子句,还可以有一个可选的else子句,语法格式如下
    try:
        try_suite
    except EXception1[,reason]:
        suite_exception1
    except(exception2,exception3,....)[,reason]:      一次捕获多个异常时要定义为元组
        suite
    except:                                                空except语句用于捕获一切异常
        suite_
    else:
        else_suite
    
    
    except分句个数没有限制,但else只能有一个
    没有异常发生时,else分句才会执行
    没有符合except分句时,异常会向上传递到程序中的之前进入的try中或者到进程的顶层
    
    
try-finally语句
无论异常是否发生,finally子句都会执行
    常用于定义必需进行清理的动作,如关闭或断开服务器连接等
finally中的所有代码执行完毕后会继续向上一层引发异常
语法:    
    try:
        try_suite
    finally:
        finally_suite
        
    例如:
>>>    try:
        f1 = open("/tmp/a.txt",'r')
        f1.write("hello world")
    finally:
        f1.close()
    
Traceback (most recent call last):
    file "<stdin>",line 3, in <module>
IOError:file not open for writing


总结:try语句的分句形式

分句形式                        说明
except:                            捕捉所有异常类型
except name:                    只捕捉特定的异常
except name, value:                捕捉所列的异常和其它额外的数据(或实例)
except (name1, name2):            捕捉任何列出的异常
except (name1, name2), value:    捕捉任何列出的异常,并取得额外数据
else:                            如果没有引发异常,就运行
finally                            总是会运行此代码块
    
    
try-except-else-finally语句

语法:
    try:
        try_suite
    except Exception1:                        错误1怎么做
        suite1_exceptinon1
    except (Exception2,Exception3):        错误23怎么做
        suite23_exception23
    ....
    else:                                    其它错误怎么做
        else_suite
    finally:                                总是执行
        finally_suite
    可以替换为在try-finally语句中嵌套try-except语句的形式
    
    
    try:
        try:
            try_suite
        except ....
        except ....
    finally:
        finally_suite
    
自定义异常
    raise语句可显示触发异常
        raise [SomeException [,args[,traceback]]]
            someException:可选字段
            args:可选,以元组的形式传递给异常的参数
            traceback:可选,异常触发时新生成的一个用于异常-正常化的跟踪记录,多用于重新引发异常时
            
        例如:
    >>>def CrossProduct(seq1,seq2):
            if not seq1 or seq2:
                    raise ValueError,"Sequence argements must be non-empty"
            return [(x1,x2) for x1 in seq1 for x2 in seq2]
    >>>seq1=[]
    >>>seq2=[]
    >>>CrossProduct(seq1,seq2)
    
    Traceback (most recent call last):
        File "<pyshell#25>",line 1, in <module>
            CrossProduct(sqe1,sqe2)
        File "<pyshell#22>",line 3,in CrossProduct
            raise ValueError,"Sequence argements must be non-empty"
        ValueError: Sequence argements must be non-empty
        
    例如:我们自定义一个异常,判断aa和bb,如果aa和bb不是列表的话就抛出异常AttributeError(属性错误)
        
    >>>    def func(a,b):
   .>>>     if type(a)!="list" or type(b)!="list":
   .>>>         raise AttributeError,"a and b must be list"
                        
            
    >>>    aa = (1,2)
    >>>    bb = (3,4)    
    >>>func(aa,bb)
            
    报错:
AttributeError                            Traceback (most recent call last)
<ipython-input-5-2914e0c3d296> in <module>()
----> 1 func(aa,bb)

<ipython-input-1-718d31a6dce6> in func(a, b)
      1 def func(a,b):
      2     if type(a)!="list" or type(b)!="list":
----> 3         raise AttributeError,"a and b must be list"
      4  
      5
            
------------------异常对象-------------------------------
Python异常是内置的经典类Exception的子类的实例
    为了向后兼容,python还允许使用字符串或任何经典类实例
    python2.5之后,Exception是从BaseException继承的新式类
python自身引发的所有异常都是Exception的子类的实例
大多的标准异常都是由StandardError派生的,其中有3各抽象的子类
    ArithmeticError
        由于算术错误而引发的异常基类
        OverflowError,ZeroDivisionError,FloatingPointError
    LookupError
        容器在接受到一个无效键或索引时引发的异常的基类
        IndexError,KeyError
    EnvironmentError
        由于外部原因而导致的异常的基类
        IOError,OSError,WindowsError
        
--------------标准异常类----------------------------------
AttributeError:属性错误
IOError:I/O操作失败
ImportError:import找不到导入的模块
IdentationError:缩进错误
IndexError:用来索引序列的整数超出范围
NameError:引用了一个不存在的变量名

........等

--------自定义异常类-----
自定义异常类和多重继承
    较有效的方法是从自定义异常类和标准异常类进行多重继承,例如:
    Class CustomAttributeError(CustomException,AttributeError):
        pass
标准库中使用的其它异常
    python标准库中的许多模块都定义了自己的异常类,
    如socket中的socket.Error
    

总结:
        python异常对象
            通过类BaseException生成
        raise触发异常
        
            assert 断言
            
        try:
            except
            except    BaseException
            else
            
            try-finally
            try-except-else-finally
            try:
                try-except-else
            finally:
            
        
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
   

转载于:https://www.cnblogs.com/RomanticYori/p/6044918.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值