首页 > 代码库 > python基础16(错误、异常)

python基础16(错误、异常)

一、什么是错误,什么是异常

错误是指在执行代码过程中发生的事件,它中断或干扰代码的正常流程并创建异常对象。当错误中断流程时,该程序将尝试寻找异常处理程序(一段告诉程序如何对错误做出响应的代码),以帮助程序恢复流程。换句话说,错误是一个事件,而异常是该事件创建的对象

当使用短语“产生异常”时,表示存在问题的方法发生错误,并创建异常对象(包含该错误的信息及发生的时间和位置)来响应该错误。导致出现错误和随后异常的因素包括用户错误、资源失败和编程逻辑失败。这些错误与代码实现特定任务的方法有关,而与该任务的目的无关。

如果不进行异常处理,即不对错误做出响应,程序的健壮性就会大打折扣,甚至无法保证正常运行,所以必须要进行异常处理。

在项目开发中,异常处理是不可或缺的。异常处理帮助人们debug,通过更加丰富的信息,让人们更容易找到bug的所在。异常处理还可以提高程序的容错性。

二、python中的异常

在Python中,异常也是对象,可对它进行操作。所有异常都是基类 Exception的成员。所有异常都从基类Exception继承,而且都在exceptions模块中定义。

python用异常对象(exception object)来表示异常情况,遇到错误后,会引发异常。如果异常对象并未被处理或捕捉,程序就会用所谓的 回溯(Traceback, 一种错误信息)终止执行:

>>> 1/0Traceback (most recent call last):  File "<pyshell#0>", line 1, in <module>    1/0ZeroDivisionError: integer division or modulo by zero

 按自己的方式出错

raise语句

为了引发异常,可以使用一个类(Exception的子类)或者实例参数数调用raise 语句。下面的例子使用内建的Exception异常类:

>>> raise Exception  # 引发一个没有任何错误信息的普通异常Traceback (most recent call last):  File "<pyshell#2>", line 1, in <module>    raise ExceptionException>>> raise Exception(hyperdrive overload)   # 添加了一些异常错误信息Traceback (most recent call last):  File "<pyshell#3>", line 1, in <module>    raise Exception(hyperdrive overload)Exception: hyperdrive overload

 

 常用的内建异常类:

三、捕捉异常

我们可以使用 try/except 来实现异常的捕捉处理。

>>> try:    res = 2/0except ZeroDivisionError:    print "Error:Divisor must not be zero!"    Error:Divisor must not be zero!

看,我们真的捕获到了ZeroDivisionError异常!那如果我想捕获并处理多个异常怎么办呢?有两种办法,一种是给一个except子句传入多个异常类参数,另外一种是写多个except子句,每个子句都传入你想要处理的异常类参数。甚至,这两种用法可以混搭呢!

多个except 子句

try:    x = input(Enter the first number: )    y = input(Enter the second number: )    print x/yexcept ZeroDivisionError:    print "The second number can‘t be zero!"except TypeError:           # 对字符的异常处理  print "Please enter a number!"  #再来运行:>>> Enter the first number: 10Enter the second number: hello,wordPlease enter a number!

 

 

 

一个块捕捉多个异常

如果需要用一个块捕捉多个异常,那么可以将它们作为元组列出。

try:    x = input(Enter the first number: )    y = input(Enter the second number: )    print x/yexcept (ZeroDivisionError,TypeError,NameError):    # 将错误类型以列表方式列出    print "Yout numbers were bogus..."

 

try ... except...else 语句

    现在我们来说说这个else语句。Python中有很多特殊的else用法,比如用于条件和循环。放到try语句中,其作用其实也差不多:就是当没有检测到异常的时候,则执行else语句。

while True:    try:        x = input(Enter the first numbre: )        y = input(Enter the second numbre: )        value = x/y        print x/y is,value    except:        print Invalid input,please try again.    else:        break   # 这里的循环只在没有异常引发的情况才会退出

 

finally 子句

finally子句是无论是否检测到异常,都会执行的一段代码,我们可以丢掉except子句和else子句,单独使用try...finally,也可以配合except等使用。

try:    s = 1/0#except Exception,e:except ZeroDivisionError, e:    print Error:%s %efinally:    print ok

 

 

完整的语法结构如下:

try:    ...except exception1:    ...except exception2:    ...except:    ...else:    ...finally:    ...

 

如果try中有异常发生时,将执行异常的归属,执行except。异常层层比较,看是否是exception1, exception2...,直到找到其归属,执行相应的except中的语句。

 

python基础16(错误、异常)