|
|
|
|
移动端

2.5.1 异常(2)

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

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

人工智能+区块链的发展趋势及应用调研报告


2.5.1 异常(2)

因此,下面的异常都会被except块处理:

  1. > 1   
  2. invalid value   
  3. > 0   
  4. invalid value   
  5. > -1   
  6. invalid value   
  7. > 2   
  8. 1 / log10(2.0) = 3.32192809489   
  9. > q 

2)第二种方式,我们可以在一个except块中声明多个异常类型:

  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 (ValueError, ZeroDivisionError):  
  11.    print "invalid value" 

程序运行抛出其中任意一种类型的异常都会被except块所处理。

3)第三种方式,通过多个 except块分别处理各种类型的异常,每个 except块负责处理一种类型的异常:

  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 ValueError:  
  11.    print "the value must be greater than 0"  
  12.     except ZeroDivisionError:  
  13.    print "the value must not be 1" 

在这种情况下,两种类型的异常会被程序分别处理:

  1. > 1   
  2. the value must not be 1   
  3. > -1   
  4.  
  5. the value must be greater than 0   
  6. > abcde   
  7. the value must be greater than 0   
  8. > 2   
  9. 1 / log10(2.0) = 3.32192809489   
  10. > q  

3.得到异常的具体信息

当我们输入字符串“abcde”时,上面的程序会提示: “the value must be greater than 0”,这与实际情况不符。抛出 ValueError异常的部分并不是 math.log10()函数,而是float()函数。

调用 float('abcde')时,由于所给字符串不能转化为浮点数,Python会抛出一个“ValueError: could not convert string to float: abcde”的异常。这个异常包含两部分的内容:前面的部分表示异常的类型,后面的部分表示异常的具体说明。

在except块中,我们可以这样获得异常的具体信息:

  1. except SomeError as e:  
  2.     print e.message 

利用这种方式,我们首先将捕获到的异常保存在变量 e中,并用属性.message查看相关的说明信息。

为了得到异常的具体信息,修改except块的部分:

  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 = 1 / math.log10(x)  
  10.    print "1 / log10({0}) = {1}".format(x, y)  
  11.  
  12.     except Exception as e:  
  13.    print e.message 

运行后,当我们输入非法值时,就能得到异常的具体信息:

  1. > 1   
  2. float division by zero   
  3. > -1   
  4. math domain error   
  5. > abcde   
  6. could not convert string to float: abcde   
  7. > 2   
  8. 1 / log10(2.0) = 3.32192809489   
  9. > q  

4.抛出异常

在程序运行过程中,我们可以使用关键字 raise抛出异常。

例如,当变量month为不合法的月份时抛出异常:

  1. if month > 12 or month < 1:   
  2.     raise ValueError("month must be between 1 and 12") 

抛出的异常类型为ValueError,括号中为具体说明信息。

5. finally关键字

异常处理时,我们还可以加入一个以关键字 finally开头的代码块,其作用为:不管try块中的代码是否抛出异常,finally块中的内容总是会被执行。

没有异常时,finally块会在 try块的代码执行完毕后执行;出现异常时,finally块会在抛出异常前执行。因此,finally块可以用来作为程序抛出异常时的安全保证,比如确保打开的文件被正确关闭。

例如,一个没有异常的finally块:

  1. In [1]: try:  
  2.    ...:     print 1  
  3.    ...: finally:  
  4.    ...:     print 'finally was called.'  
  5.    ...:  
  6. 1  
  7. finally was called. 

抛出异常的try块,如果异常没有被处理,finally块在抛出异常之前执行:

  1. In [2]: try:  
  2.    ...:     print 1 / 0  
  3.    ...: finally:  
  4.    ...:     print 'finally was called.'  
  5.    ...:  
  6. finally was called.  
  7. ZeroDivisionError    Traceback (most recent call last)  
  8. <ipython-input-13-87ecdf8b9265> in <module>()  
  9.  1 try:  
  10. ----> 2     print 1 / 0  
  11.  3 finally:  
  12.  4    print 'finally was called.'  
  13. ZeroDivisionError: integer division or modulo by zero 

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

51CTO读书频道二维码


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

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

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

读 书 +更多

人月神话:32周年中文纪念版

在软件领域,很少能有像《人月神话》一样具有深远影响力并且畅销不衰的著作。Brooks博士为人们管理复杂项目提供了最具洞察力的见解。既有很...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊