全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Python 异常处理的实例详解

Python 异常处理的实例详解

与许多面向对象语言一样,Python 具有异常处理,通过使用 try...except 块来实现。

Note: Python v s. Java 的异常处理

Python 使用 try...except 来处理异常,使用 raise 来引发异常。Java 和 C++ 使用 try...catch 来处理异常,使用 throw 来引发异常。

异常在 Python 中无处不在;实际上在标准 Python 库中的每个模块都使用了它们,并且 Python 自已会在许多不同的情况下引发它们。在整本书中你已经再三看到它们了。

• 使用不存在的字典关键字    将引发 KeyError 异常。
• 搜索列表中不存在的值    将引发 ValueError 异常。
• 调用不存在的方法    将引发 AttributeError 异常。
• 引用不存在的变量    将引发 NameError 异常。
• 未强制转换就混用数据类型    将引发 TypeError 异常。

在这些情况下,我们都在简单地使用 Python IDE:一个错误发生了,异常被打印出来 (取决于你的 IDE,可能会有意地以一种刺眼的红色形式表示),这便是。这叫做未处理异常;当异常被引发时,没有代码来明确地关注和处理它,所以异常被传给置在 Python 中的缺省的处理,它会输出一些调试信息并且终止运行。在 IDE 中,这不是什么大事,但是如果发生在你真正的 Python 程序运行的时候,整个程序将会终止。

然而,一个异常不一定会引起程序的完全崩溃。当异常引发时,可以被处理掉。有时候一个异常实际是因为代码中的 bug (比如使用一个不存在的变量),但是许多时候,一个异常是可以预见的。如果你打开一个文件,它可能不存在。如果你连接一个数据库,它可能不可连接或没有访问所需的正确的安全证书。如果知道一行代码可能会引发异常,你应该使用一个 try...except 块来处理异常。

1. 打开一个不存在的文件

>>> fsock = open("/notthere", "r")   (1) 
Traceback (innermost last): 
 File "<interactive input>", line 1, in ? 
IOError: [Errno 2] No such file or directory: '/notthere' 
>>> try: 
...   fsock = open("/notthere")    (2) 
... except IOError:           (3) 
...   print "The file does not exist, exiting gracefully" 
... print "This line will always print" (4) 
The file does not exist, exiting gracefully 
This line will always print 

(1)  使用内置 open 函数,我们可以试着打开一个文件来读取 (在下一节有关于open 的更多内容)。但是那个文件不存在,所以这样就引发 IOError 异常。因为我们没有提供任何显式的对 IOError 异常的检查,Python 仅仅打印出某个关于发生了什么的调试信息,然后终止。

(2)  我们试图打开同样不存在的文件,但是这次我们在一个 try...except 内来执行它。

(3)  当 open 方法引发 IOError 异常时,我们已经准备好处理它了。except IOError: 行捕捉异常,接着执行我们自已的代码块,这个代码块在本例中只是打印出更令人愉快的错误信息。

(4)  一旦异常被处理了,处理通常在 try...except 块之后的第一行继续进行。注意这一行将总是打印出来,无论异常是否发生。如果在你的根目录下确实有一个叫 notthere 的文件,对 open 的调用将成功,except 子句将忽略,并且最后一行仍将执行。
异常可能看上去不友好 (毕竟,如果你不捕捉异常,整个程序将崩溃),但是考虑一下别的方法。你该不会希望获得一个指向不存在的文件的对象吧?不管怎么样你都得检查它的有效性,而且如果你忘记了,你的程序将会在下面某个地方给出奇怪的错误,这样你将不得不追溯到源程序。我确信你做过这种事;这可并不有趣。使用异常,一发生错误,你就可以在问题的源头通过标准的方法来处理它们。

2. 为其他用途使用异常

除了处理实际的错误条件之外,对于异常还有许多其它的用处。在标准 Python 库中一个普通的用法就是试着导入一个模块,然后检查是否它能使用。导入一个并不存在的模块将引发一个 ImportError 异常。你可以使用这种方法来定义多级别的功能――依靠在运行时哪个模块是有效的,或支持多种平台 (即平台特定代码被分离到不同的模块中)。你也能通过创建一个从内置的 Exception 类继承的类定义你自己的异常,然后使用 raise 命令引发你的异常。如果你对此感兴趣,请看进一步阅读的部分。

下面的例子演示了如何使用异常支持特定平台功能。代码来自 getpass 模块,一个从用户获得口令的封装模块。获得口令在 UNIX、Windows 和 Mac OS 平台上的实现是不同的,但是这个代码封装了所有的不同之处。

# Bind the name getpass to the appropriate function 
try: 
  import termios, TERMIOS           (1) 
except ImportError: 
  try: 
    import msvcrt              (2) 
  except ImportError: 
    try: 
      from EasyDialogs import AskPassword (3) 
    except ImportError: 
      getpass = default_getpass      (4) 
    else:                  (5) 
      getpass = AskPassword 
  else: 
    getpass = win_getpass 
else: 
  getpass = unix_getpass 

(1)  termios 是 UNIX 独有的一个模块,它提供了对于输入终端的底层控制。如果这个模块无效 (因为它不在你的系统上,或你的系统不支持它),则导入失败,Python 引发我们捕捉的 ImportError 异常。

(2)  OK,我们没有 termios,所以让我们试试 msvcrt,它是 Windows 独有的一个模块,可以提供在 Microsoft Visual C++ 运行服务中的许多有用的函数的一个 API。如果导入失败,Python 会引发我们捕捉的 ImportError 异常。

(3)  如果前两个不能工作,我们试着从 EasyDialogs 导入一个函数,它是 Mac OS 独有的一个模块,提供了各种各样类型的弹出对话框。再一次,如果导入失败,Python 会引发一个我们捕捉的 ImportError 异常。

(4)  这些平台特定的模块没有一个有效 (有可能,因为 Python 已经移植到了许多不同的平台上了),所以我们需要回头使用一个缺省口令输入函数 (这个函数定义在 getpass 模块中的别的地方)。注意我们在这里所做的:我们将函数 default_getpass 赋给变量 getpass。如果你读了官方 getpass 文档,它会告诉你 getpass 模块定义了一个 getpass 函数。它是这样做的:通过绑定 getpass 到正确的函数来适应你的平台。然后当你调用 getpass 函数时,你实际上调用了平台特定的函数,是这段代码已经为你设置好的。你不需要知道或关心你的代码正运行在何种平台上;只要调用 getpass,则它总能正确处理。

(5)  一个 try...except 块可以有一条 else 子句,就像 if 语句。如果在 try 块中没有异常引发,然后 else 子句被执行。在本例中,那就意味着如果 from EasyDialogs import AskPassword 导入可工作,所以我们应该绑定 getpass 到 AskPassword 函数。其它每个 try...except 块有着相似的 else 子句,当我们发现一个 import 可用时,就绑定 getpass 到适合的函数。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Python  # 异常  # 异常的详解  # 异常的处理  # Python异常处理总结  # Python 异常处理实例详解  # python中的五种异常处理机制介绍  # 深入理解python try异常处理机制  # Python常见异常分类与处理方法  # python异常和文件处理机制详解  # Python异常处理例题整理  # Python 异常处理总结  # Python中异常处理及最佳实践举例详解  # 不存在  # 如果你  # 子句  # 它是  # 试着  # 绑定  # 将会  # 它会  # 方法来  # 自己的  # 库中  # 打印出来  # 本例  # 情况下  # 这一  # 在这里  # 是因为  # 就像  # 本书  # 你可以 


相关文章: 如何在建站之星网店版论坛获取技术支持?  建站DNS解析失败?如何正确配置域名服务器?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  七夕网站制作视频,七夕大促活动怎么报名?  建设网站制作价格,怎样建立自己的公司网站?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  高端云建站费用究竟需要多少预算?  香港服务器租用费用高吗?如何避免常见误区?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  建站之星代理如何优化在线客服效率?  完全自定义免费建站平台:主题模板在线生成一站式服务  制作证书网站有哪些,全国城建培训中心证书查询官网?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  PHP 500报错的快速解决方法  宿州网站制作公司兴策,安徽省低保查询网站?  *服务器网站为何频现安全漏洞?  如何选择高效稳定的ISP建站解决方案?  常州自助建站费用包含哪些项目?  如何用5美元大硬盘VPS安全高效搭建个人网站?  广平建站公司哪家专业可靠?如何选择?  家具网站制作软件,家具厂怎么跑业务?  定制建站流程解析:需求评估与SEO优化功能开发指南  Android自定义listview布局实现上拉加载下拉刷新功能  手机网站制作与建设方案,手机网站如何建设?  如何在局域网内绑定自建网站域名?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  如何在建站宝盒中设置产品搜索功能?  建站之星价格显示格式升级,你的预算足够吗?  如何通过VPS建站实现广告与增值服务盈利?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  建站之星后台密码遗忘?如何快速找回?  婚礼视频制作网站,学习*后期制作的网站有哪些?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  如何快速生成高效建站系统源代码?  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  建站主机空间推荐 高性价比配置与快速部署方案解析  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  C#如何序列化对象为XML XmlSerializer用法  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  制作表格网站有哪些,线上表格怎么弄?  建站主机功能解析:服务器选择与快速搭建指南  如何快速搭建高效简练网站?  ppt制作免费网站有哪些,ppt模板免费下载网站?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  如何规划企业建站流程的关键步骤?  浅析上传头像示例及其注意事项 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。