python基础16(错误、异常)

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

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

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

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

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

二、python中的异常

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

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

>>> 1/0

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    1/0
ZeroDivisionError: 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 Exception
Exception
>>> 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/0
except 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/y
except ZeroDivisionError:
    print "The second number can‘t be zero!"
except TypeError:           # 对字符的异常处理
  print "Please enter a number!"
  
#再来运行:
>>> 
Enter the first number: 10
Enter the second number: hello,word
Please enter a number!

 

 

 

一个块捕捉多个异常

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

try:
    x = input(Enter the first number: )
    y = input(Enter the second number: )
    print x/y
except (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 %e
finally:
    print ok

 

 

完整的语法结构如下:

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

 

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

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。