文档章节

Python入门教程系列:一、异常处理

东方神剑
 东方神剑
发布于 2015/02/14 20:57
字数 1658
阅读 264
收藏 18

    前面几章,我们已经把Python的基础内容简单说了一些,从这章开始,我们算是入门级别的学习了,主要把剩下的一些内容说一下,主要包括异常处理、模块的使用、函数的使用、面向对象、正则匹配、数据库、网络(爬虫),最后我们会有一个关于机器学习的高级系列教程。

    异常处理,用最通俗的话说,就是你的程序出错了,这错误也分好几种,有的可能是语法错误,比如你多写少写错写个字符等,也有逻辑错误,比如1>2,语法上没错误但是逻辑错误,对于初级选手来说,犯得最多的错误就是马虎,也就是语法错误,对于菜鸟级的犯得最多的错误是你认为你的代码可以那么那么运行,实际上完全不是那么运行的,甚至你就是盯着代码看好久你也不知道哪错了,总认为程序是按照1、2、3步来的,实际上是按照1、3步来的,第2步无论如何也不会运行,这就是可能你对某些语法的结构还不是真的很清楚。

    当然这不意味着只要你仔细点,只要你对语法结构都很清楚你就不会犯错,错误时刻都有可能发生,比如人为的故意错误操作等,所以出错不可怕,不出错的程序才可怕,。问题是我们怎么样使我们的程序有较强的健壮性,即使出现错误,发现错误也可以继续工作而不是崩溃。

我们先举几个例子看一下:

第一个例子是变量未定义错误,通常我们编程序时也不需要格外定义个变量名,但是可以直接使用,也没出错啊,怎么在这就不行了?比如,我们定义个字符串'python',通常我们直接写  str1 = 'python'就可以了,也没格外先定义str1,其实字符串本身也是个对象,我们定义了个str1对象(对象类型未知),然后对其赋值(此时对象类型明确为字符串),这是正确的语法,而单纯写个str1就是错误的,对象类型未知的空对象。

第二个例子是除以0错误,地球人都知道

第三个语法格式错误,SyntaxError是唯一一个在编译时的错误提示,也就是说你的程序结构错误,在这里是说for语法错误

第四个错误是数组越界错误,本来就3个东西,你想找第4个肯定找不到要出错

第五个错误是字典要查询的键不存在。

第六个错误是文件不存在错误,这种错误十有八九不是说真的不存在,而是路径写的不全或者写错了

当然还有其他的错误,这里只是举了几个常见的。

错误检测和异常处理:

1、try-except

2、try-finally

3、try-except-finally

都是什么意思呢?try-except就是将可能出错的代码放到try里,就是试试的意思,如果有可能出错我们就在except语句中给出解决方案,当然这个错误类型可能有好几种,所以这个except就可以有好几个,不过要注意的是先匹配具体的错误也可以说的小范围的错误,然后在匹配大范围的错误,这是什么道理呢?比如错误1包含错误2,那么你先匹配错误1,那么无论如何错误2都不会再被匹配了,也就是说错误2给出的处理方案永不可达,这就是逻辑错误了。finally就是无论是否出错都会运行finally中的代码,所以finally最多只允许出现一次。上面给出3种搭配方案。

下面举个例子给大家看一下,说的再多不如演示一个。

>>> try:
... f = open('blah', 'r')
... except IOError, e:
... print 'could not open file:', e
...
could not open file: [Errno 2] No such file or directory

try 语句块中异常发生点后的剩余语句永远不会到达(所以也永远不会执行). 一旦一个异常被引发, 就必须决定控制流下一步到达的位置. 剩余代码将被忽略, 解释器将搜索处理器, 一旦找到,就开始执行处理器中的代码.如果没有找到合适的处理器, 那么异常就向上移交给调用者去处理, 这意味着堆栈框架立即回到之前的那个. 如果在上层调用者也没找到对应处理器, 该异常会继续被向上移交, 直到找到合适处理器. 如果到达最顶层仍然没有找到对应处理器, 那么就认为这个异常是未处理的, Python 解释器会显示出跟踪返回消息, 然后退出.

多个except的例子:

def safe_float(obj):
    try:
        retval = float(obj)
        except ValueError:
        retval = 'could not convert non-number to float'
        except TypeError:
        retval = 'object type cannot be converted to float'
        return retval

捕获所有的异常:

所有错误的根就是Exception,它是处于最顶层的。

try:
        :
except Exception, e:
    # error occurred, log 'e', etc.

虽然这样的代码捕获大多异常, 但它不是好的 Python 编程样式. 一个主要原因是它不会考虑潜在的会导致异常的主要原因.

 try:
        :
except Exception, e:
    # error occurred, log 'e', etc.

except ValueError:

     ……

这种写法就是错误的,因为无论Exception包含ValueError错误,所以……中的语句无论如何也不会运行。

这里再提个小插曲,else语句在try-except中也可以使用,如果错误未匹配可以运行else语句中的内容。

try:
A
except MyException: B
else: C
finally: D

 

try:
    try_suite
finally:
    finally_suite #无论如何都执行

综合了这一章目前我们所见过的所有不同的可以处理异常的语法样式:

try:
    try_suite
except Exception1:
    suite_for_Exception1
except (Exception2, Exception3, Exception4):
    suite_for_Exceptions_2_3_and_4
except Exception5, Argument5:
    suite_for_Exception5_plus_argument
except (Exception6, Exception7), Argument67:
    suite_for_Exceptions6_and_7_plus_argument
except:
    suite_for_all_other_exceptions
else:
    no_exceptions_detected_suite

finally:
    always_execute_suite

关于异常捕获处理的更多内容可参考《Python核心编程》第十章内容,谢谢。

© 著作权归作者所有

共有 人打赏支持
东方神剑

东方神剑

粉丝 65
博文 126
码字总数 93166
作品 0
朝阳
程序员
私信 提问
[雪峰磁针石博客]python数据分析快速入门教程2-pandas数据结构

Title: python数据分析快速入门教程2-pandas数据结构 Date: 2018-03-31 9:20 Category: 数据分析 Slug: pythonpandascrash_tutorial2 [雪峰磁针石博客]python数据分析快速入门教程1-开胃菜 ...

Python测试开发人工智能
07/10
0
0
关于深度学习的学习资料免费送给你

一、免费书籍随意读: 1.《深度学习之美:AI时代的数据处理与最佳实践》本书作者张玉宏博士在阿里云云栖社区为读者免费呈现部分书中文字: 一入侯门“深”似海,深度学习深几许(深度学习入...

【方向】
06/27
0
0
[雪峰磁针石博客]python3快速入门教程11命令行自动化工具与pexpect

[雪峰磁针石博客]python3快速入门教程 命令行自动化与pexpect 简介 Pexpect 是一个用来启动交互式命令行子程序并对其进行自动控制的 Python 工具模块。 Pexpect 可以用来和像 ssh、ftp、pas...

Python测试开发人工智能
07/25
0
0
给伸手党的福利:Python 新手入门引导

这是一篇 Python 入门指南,针对那些没有任何编程经验,从零开始学习 Python 的同学。不管你学习的出发点是兴趣驱动、拓展思维,还是工作需要、想要转行,都可以此文作为一个参考。 在这个信...

crossin
06/15
0
0
年薪20万Python工程师进阶(1):Python 资源 + 经典练手项目

Python 越来越火爆,最近自己也在学习。整理下一些 Python 资料,和练手的项目。希望对你学习 Python 有所帮助。 1、入门阶段 1 Python 官网 Python 官网 The Python Tutorialdocs.python.o...

程序员八阿哥
05/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Ubuntu常用操作

查看端口号 netstat -anp |grep 端口号 查看已使用端口情况 netstat -nultp(此处不用加端口号) netstat -anp |grep 82查看82端口的使用情况 查找被占用的端口: netstat -tln netstat -tl...

hc321
昨天
0
0
网站cdn的静态资源突然访问变的缓慢,问题排查流程

1.首先我查看了一下是否自己的网络问题,通过对比其他资源的访问速度和下载速度,确认不是 2.通过ping 和 tracert 判断cdn域名能否正常访问,(最后回想感觉这一步可以省略,因为每次最终能访...

小海bug
昨天
0
0
Mybatis 学习笔记四 MyBatis-Plus插件

Mybatis 学习笔记四 MyBatis-Plus插件 maven依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <ve......

晨猫
昨天
4
0
小白带你认识netty(二)之netty服务端启动(下)

承接上一篇小白带你认识netty(二)之netty服务端启动(上),还剩下两步骤:3、注册Selector:将Channel注册到Selector上 和 4、端口的绑定:服务端端口的监听。 3、注册Selector:将Chann...

天空小小
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部