python编程进阶之异常处理用法实例分析

作者:Nicoder 时间:2023-01-27 16:39:24 

本文实例讲述了python异常处理用法。分享给大家供大家参考,具体如下:

之前用Java的时候,在容易出错的地方我们经常使用try…catch或者try…catch…finally来捕捉和显示异常,在python中很高兴地发现它也有这样的机制。

try..except

这个用于当异常出现的时候,用except从句来处理异常,而不至于程序自动退出。例如,在python里获取用户输入时,若用户输入文件结束符Ctrl-d,则会引发EOFError文件结束异常。我们使用try except来处理:


#!/usr/bin/python
# Filename: try_except.py
import sys
try:
 s = raw_input('Enter something --> ')
except EOFError:
 print '\nWhy did you do an EOF on me?'
 sys.exit() # exit the program
except:
 print '\nSome error/exception occurred.'
 # here, we are not exiting the program
print 'Done'

我们在运行程序的时候输入Ctrl-d:

$ python try_except.py
Enter something -->
Why did you do an EOF on me?

$ python try_except.py
Enter something --> Python is exceptional!
Done

可以看到,当遇到EOFERROR时,程序执行了except EOFError:中的内容。若出现其他异常,则会执行except:从句中的内容。except后面还可以加else从句,如果没有发生异常,则执行else从句中的内容。记住,首先,我们要导入sys模块!!

try.. catch

catch主要用于异常出现的时候抓取异常,方便显示异常信息。但是我还没有见别人用过,找不到例子~所以是不推荐用嘛?谁找到例子可以留言给我^.^

try.. finally

假如你在读一个文件的时候,希望在无论异常发生与否的情况下都关闭文件,该怎么做呢?这可以使用finally块来完成。注意,在一个try块下,你可以同时使用except从句和finally块。如果你要同时使用它们的话,需要把一个嵌入另外一个。举个例子(还记得文件读写里的poem嘛):


#!/usr/bin/python
# Filename: finally.py
import time
try:
 f = file('poem.txt')
 while True: # our usual file-reading idiom
   line = f.readline()
   if len(line) == 0:
     break
   time.sleep(2)
   print line,
finally:
 f.close()
 print 'Cleaning up...closed the file'

输出:

$ python finally.py
Programming is fun
When the work is done
Cleaning up...closed the file
Traceback (most recent call last):
  File "finally.py", line 12, in ?
    time.sleep(2)
KeyboardInterrupt

我们进行通常的读文件工作,但是我有意在每打印一行之前用time.sleep方法暂停2秒钟。这样做的原因是让程序运行得慢一些(Python由于其本质通常运行得很快)。在程序运行的时候,按Ctrl-c中断/取消程序。

我们可以观察到KeyboardInterrupt异常被触发,程序退出。但是在程序退出之前,finally从句仍然被执行,把文件关闭

用raise引发异常

我们可以使用raise语句 引发 异常,但要指明错误/异常的名称和伴随异常 触发的 异常对象。你可以引发的错误或异常应该分别是一个Error或Exception类的直接或间接子类。举个例子:


#!/usr/bin/python
# Filename: raising.py
class ShortInputException(Exception):
 '''A user-defined exception class.'''
 def __init__(self, length, atleast):
   Exception.__init__(self)
   self.length = length
   self.atleast = atleast
try:
 s = raw_input('Enter something --> ')
 if len(s) < 3:
   raise ShortInputException(len(s), 3)
 # Other work can continue as usual here
except EOFError:
 print '\nWhy did you do an EOF on me?'
except ShortInputException, x:
 print 'ShortInputException: The input was of length %d, \
    was expecting at least %d' % (x.length, x.atleast)
else:
 print 'No exception was raised.'

输出:

$ python raising.py
Enter something -->
Why did you do an EOF on me?

$ python raising.py
Enter something --> ab
ShortInputException: The input was of length 2, was expecting at least 3

$ python raising.py
Enter something --> abc
No exception was raised.

这里,我们创建了我们自己的异常类型,其实我们可以使用任何预定义的异常/错误。自己定义的异常类型是ShortInputException类。它有两个域——length是给定输入的长度,atleast则是程序期望的最小长度。

在except从句中,我们提供了错误类和用来表示错误/异常对象的变量。这与函数调用中的形参和实参概念类似。当触发raise从句时,会调用对应的except从句执行,在这个例子中就引发了except ShortInputException,x 这个错误,类似于调用。

更多Python相关内容感兴趣的读者可查看本站专题:《Python入门与进阶经典教程》、《Python字符串操作技巧汇总》、《Python列表(list)操作技巧总结》、《Python编码操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

来源:https://blog.csdn.net/hejunqing14/article/details/50571636

标签:python,异常处理
0
投稿

猜你喜欢

  • Python学习笔记之列表推导式实例分析

    2021-04-30 15:00:38
  • python,pycharm的环境变量设置方式

    2023-08-04 10:44:41
  • Python基于checksum计算文件是否相同的方法

    2022-11-08 20:30:48
  • 分类与类型的问题

    2008-09-12 13:10:00
  • 基于python使用Pillow做动态图在图中生成二维码以及图像处理

    2022-12-29 16:33:03
  • Python3打包exe代码2种方法实例解析

    2022-03-31 14:36:30
  • ASP四级连动下拉列表程序段

    2009-07-03 15:33:00
  • Python爬虫包BeautifulSoup异常处理(二)

    2021-12-09 21:53:42
  • 利用python脚本如何简化jar操作命令

    2021-02-12 11:08:15
  • Python中的引用和拷贝实例解析

    2022-02-26 00:59:13
  • mysqldump你可能不知道的参数

    2024-01-28 13:55:49
  • 详解Go中处理时间数据的方法

    2024-02-22 15:14:00
  • 全面了解python字符串和字典

    2021-05-03 21:06:43
  • Python实现判断一个整数是否为回文数算法示例

    2022-05-13 12:01:07
  • python爬虫请求头的使用

    2023-03-21 07:10:23
  • 解决pytorch 模型复制的一些问题

    2022-04-23 03:57:58
  • Vue父子组件传值的一些坑

    2024-04-28 09:30:57
  • Django全局启用登陆验证login_required的方法

    2021-05-29 12:49:31
  • vue实现表单录入小案例

    2024-05-09 15:11:07
  • Python运行不显示DOS窗口的解决方法

    2021-01-18 08:06:16
  • asp之家 网络编程 m.aspxhome.com