|
|
51CTO旗下网站
|
|
移动端

2.5.1 异常(1)

《自学Python:编程基础、科学计算及数据分析》第2章Python 基础,在本章中,我们将学习Python 语言的基本使用,掌握Python 的基本使用方法,为后续的学习打下基础。本节为大家介绍异常。

作者:李金来源:机械工业出版社|2018-05-03 21:13

2.5 异常与警告

异常和警告是编写程序过程中经常遇到的问题。为了更好地处理编程中遇到的问题,我们需要了解异常和警告的相关知识。

2.5.1 异常(1)

1.捕捉异常我们在运行代码时经常遇到程序出错的情况,在 Python中,这些错误通常叫做异常(Exception)。

例如,有这样一个用于计算以 10为底的对数的程序,该程序使用 raw_input()函数从命令行读取输入,计算它的对数并输出结果,直到我们输入为 q为止:

  1. import math  
  2. while True:  
  3.     text = raw_input('> ')  
  4.     if text[0] == 'q':  
  5.  
  6.    break  
  7.     x = float(text)  
  8.     y = math.log10(x)  
  9.     print "log10({0}) = {1}".format(x, y) 

乍看起来,程序似乎没甚么问题,然而,当我们输入一个负数时,程序抛出了一个 ValueError异常,因为对数函数不能接受一个非正值输入:

  1. > -1  
  2. ValueError      Traceback (most recent call last)  
  3. <ipython-input-1-ceb8cf66641b> in <module>()  
  4.  6    break  
  5.  7    x = float(text)   
  6.  
  7. ----> 8     y = math.log10(x)  
  8.    print "log10({0}) = {1}".format(x, y)  
  9. ValueError: math domain error 

正常情况下,Python程序在抛出异常后就会停止执行。如果不希望程序停止运行,可以使用一对关键字try和except来处理异常,其基本形式如下:

  1. try:   
  2. <statements>   
  3. except <error>:   
  4. <statements> 

我们将可能抛出异常的代码,放入 try块中,然后使用except块处理相应的异常。

当 try块中的代码遇到异常时,这个异常会首先被传到 except块。如果except块能处理这个异常,则执行 except块相应的内容,然后程序继续执行;如果不能,该异常将被继续传递。

在上面的例子中,代码抛出的异常类型是 ValueError,因此,我们改写程序,将可能出错的部分放入try块,并用关键字except处理ValueError类型的异常:

  1. import math  
  2. while True:  
  3.     try:  
  4.    text = raw_input('> ')  
  5.    if text[0] == 'q':  
  6.  
  7.    break  
  8.    x = float(text)  
  9.    y = math.log10(x)  
  10.    print "log10({0}) = {1}".format(x, y)  
  11.  
  12.     except ValueError:  
  13.    print "the value must be greater than 0" 

再执行这个程序时,输入负数或者0都不会中断程序,而是打印expect块输出的信息:

  1. > -1   
  2. the value must be greater than 0   
  3. > 0   
  4. the value must be greater than 0   
  5. > 1   
  6. log10(1.0) = 0.0   
  7. > q  

2.处理不同类型的错误信息

我们对上面的代码进行修改,将y的值改为1/math.log10(x):

  1. import math  
  2. while True:     try:  
  3.    text = raw_input('> ')  
  4.    if text[0] == 'q':  
  5.    break  
  6.    x = float(text)  
  7.    y = 1 / math.log10(x)  
  8.    print "1 / log10({0}) = {1}".format(x, y)  
  9.     except ValueError:  
  10.    print "the value must be greater than 0" 

如果输入1:

  1. > 1  
  2. ZeroDivisionError    Traceback (most recent call last)  
  3. <ipython-input-3-7607f1ae6af9> in <module>()  
  4.  7   break  
  5.  8    x = float(text)  
  6. ----> 9     y = 1 / math.log10(x)  
  7. 10    print "1 / log10({0}) = {1}".format(x, y)  
  8. 11    except ValueError:  
  9. ZeroDivisionError: float division by zero 

因为1的对数为0,而 1/0是一个非法操作,所以Python抛出了一个ZeroDivisionError类型的异常。

这个异常首先传到 except块中,但我们定义的 except块并不能处理这种类型的异常,因此,该异常被继续传递,程序停止运行。

这个问题有以下几种解决方式。

1)第一种方式,可以使用 Exception替换 ValueError,直接捕获所有的异常。Exception类型是各种异常的总称,所以ZeroDivisionError类型和ValueError类型都是一种特殊的Exception:

  1. import math  
  2. while True:  
  3.     try:  
  4.    text = raw_input('> ')  
  5.    if text[0] == 'q':  
  6.    break  
  7.    x = float(text)  
  8.    y = 1 / math.log10(x)  
  9.    print "1 / log10({0}) = {1}".format(x, y)  
  10.     except Exception:  
  11.    print "invalid value" 

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

公钥基础设施PKI及其应用

公钥基础设施PKI(Public Key Infrastructure)是利用公钥概念和加密技术为网上通信提供的符合标准的一整套安全基础平台。公钥基础设施能为...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊