Python学习笔记13

错误和异常

 

错误和异常在程序设计中是两个不同的概念。这两个概念又有着密切联系。

错误是客观存在的一个现象。错误就在那里,不声不响。

错误分为语法错误和逻辑错误。

语法错误是静态的,编译/解释程序会发现这些语法错误,并辅助我们纠正这些语法错误。

逻辑错误动态的,是运算逻辑不完整不正确,会导致程序运行失败。

 

异常是一种手段措施,是系统发现程序运行出错后,为避免程序失败,中断正常控制流程并采取的措施。这个措施分为两个阶段:首先发布错误信息(抛出异常),其次处理这个错误并采取相应的操作。

 

 

在Python语言中所说异常还表示异常对象,就是将错误发生时的状态信息封装为一个对象。我们所谓抛出异常就是生成这个异常对象并让这个对象能被访问。异常对象一般是由系统抛出,但也可以由程序主动抛出。

 

 

try-  except 语句:

try:

    normal code piece    # 系统会监控这段代码是否有错误发生,如果有会抛出相应的异常对象。

exceptException[, reason]: #程序可以捕获指定异常对象并做进一步的处理。

    except code piece    # 捕获异常后的处理代码。

 

说明:

reason将会是一个包含来自导致异常的代码的诊断信息的类实例. 异常参数自身会组成一个元组,并存储为类实例(异常类的实例)的属性. 上边的第一种用法中, reason 将会是一个Exception 类的实例. 对于大多内建异常, 也就是从 StandardError 派生的异常, 这个元组只包含一个指示错误原因的字符串. 一般说来, 异常的名字已经是一个满意的线索了, 但这个错误字符串会提供更多的信息. 操作系统或其他环境类型的错误, 例如 IOError , 元组中会把操作系统的错误编号放在错误字符串前. 无论 reason 只包含一个字符串或是由错误编号和字符串组成的元组, 调用 str(reason) 总会返回一个良好可读的错误原因. 不要忘记 reason 是一个类实例 - 这样做你其实是调用类的特殊方法 __str__() . 我们将在第 13 章探索面向对象编程中的这些特殊方法. 唯一的问题就是某些第三方或是其他外部库并不遵循这个标准协议. 我们推荐你在引发你自己的异常时遵循这个标准(参见核心风格笔记).

 

 

 

扩展支持:

1.      多个excption子句依次捕获不同的异常。

    except ValueError:

    retval = 'could not convert non-number tofloat'

    except TypeError:

    retval = 'object type cannot be convertedto float'

2.      一个exception子句中捕获多个不同的异常。要求异常被放在一个元组里:

    except (Exception1, Exception2)[, reason]:

3.      捕获所有异常:

except Exception, e:  或者 except: (裸except子句)

4.      else子句当没有异常发生时运行。

5.      finally子句无论如何都会被运行。

 

完整的异常处理的语法模板:

try:

    try_suite

 

except Exception1:

    suite_for_Exception1  

except (Exception2,Exception3, Exception4):

    suite_for_Exceptions_2_3_and_4  

except Exception5,Argument5:

    suite_for_Exception5_plus_argument

except (Exception6,Exception7), Argument67:

    suite_for_Exceptions6_and_7_plus_argument  

except:

    suite_for_all_other_exceptions

else:

    no_exceptions_detected_suite

finally:

    always_execute_suite

 

主动抛出异常:

raise[SomeException [, args [, traceback]]], 参数说明如下:

第一个参数,SomeExcpetion,是触发异常的名字.如果有,它必须是一个字符串,类或实例.

第二个符号为可选的 args(比如参数,值),来传给异常.这可以是一个单独的对象也可以是一个对象的元组.当异常发生时,异常的参数总是作为一个元组传入.如果 args 原本就是元组,那么就将其传给异常去处理;如果 args 是一个单独的对象,就生成只有一个元素的元组(就是单元素元组).

最后一项参数,traceback,同样是可选的(实际上很少用它),如果有的话,则是当异常触发时新生成的一个用于异常-正常化(exception—normally)的追踪(traceback)对象.

断言抛出异常:

断言对一个条件表达式进行判断。正常应返回真,如果运行时该条件表达式为假则抛出断言异常AssertionError. 语法如下:

assert expression[,arguments]

AssertionError 异常和其他的异常一样可以用 try-except语句块捕捉,但是如果没有捕捉,它将终止程序运行而且提供一个traceback:

Traceback(innermost last): File "<stdin>", line 1, in ?

AssertionError

对于断言触发的异常AssertError,可以提供一个参数,捕获这个断言异常的exception子句中的args可以获取这个参数。

try:

    assert 1 == 0, 'One does not equal zerosilly!'

except AssertionError,args:

    print '%s: %s' % (args.__class__.__name__,args)

 从命令行执行上面的代码会导致如下的输出:  

AssertionError: Onedoes not equal zero silly!

 

常见内建异常:

异常名称        描述

BaseException     所有异常的基类                

SystemExit       python 解释器请求退出

KeyboardInterrupt       用户中断执行(通常是输入^C)

Exception       常规错误的基类

StopIteration       迭代器没有更多的值

GeneratorExit      生成器(generator)发生异常来通知退出 

SystemExit       Python 解释器请求退出

StandardError           所有的内建标准异常的基类

ArithmeticError          所有数值计算错误的基类

FloatingPointError         浮点计算错误

OverflowError     数值运算超出最大限制

ZeroDivisionError        除(或取模)零 (所有数据类型)

AssertionError           断言语句失败

AttributeError        对象没有这个属性

EOFError        没有内建输入,到达 EOF 标记

EnvironmentError          操作系统错误的基类

IOError            输入/输出操作失败

OSError               操作系统错误

WindowsError            Windows 系统调用失败

ImportError       导入模块/对象失败

KeyboardInterrupt         用户中断执行(通常是输入^C)

LookupError          无效数据查询的基类

IndexError          序列中没有没有此索引(index)

KeyError             映射中没有这个键

MemoryError      内存溢出错误(对于 Python 解释器不是致命的)

NameError      未声明/初始化对象 (没有属性)

UnboundLocalErrorh  访问未初始化的本地变量

ReferenceErrore      弱引用(Weak reference)试图访问已经垃圾回收了的对象

RuntimeError    一般的运行时错误

NotImplementedError     尚未实现的方法

SyntaxError        Python 语法错误

IndentationError     缩进错误

TabError             Tab 和空格混用

SystemError       一般的解释器系统错误

TypeError    对类型无效的操作

ValueError    传入无效的参数

UnicodeError        Unicode 相关的错误

UnicodeDecodeError         Unicode 解码时的错误

UnicodeEncodeError       Unicode 编码时错误

UnicodeTranslateError        Unicode 转换时错误

Warning j                         警告的基类

DeprecationWarning     关于被弃用的特征的警告

FutureWarning        关于构造将来语义会有改变的警告

OverflowWarning       旧的关于自动提升为长整型(long)的警告

PendingDeprecationWarning     关于特性将会被废弃的警告

RuntimeWarning          可疑的运行时行为(runtimebehavior)的警告

SyntaxWarning         可疑的语法的警告

UserWarning            用户代码生成的警告

 

自定义异常:

def class <SelfExceptionName>(<BaseExceptionName>):

    pass

自定义一个继承了BaseExcetpton的异常类,什么也不做。对与自定义异常,只能通过raise语句抛出。

异常发生时,sys.exc_info() 函数可以获取当前的异常信息。返回一个三元组(exc_type,exc_value,exc_traceback)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值