Python入门教程系列:一、异常处理
Python入门教程系列:一、异常处理
东方神剑 发表于3年前
Python入门教程系列:一、异常处理
  • 发表于 3年前
  • 阅读 247
  • 收藏 18
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 本系列Python基础教程主要参考《Python核心编程(中文第二版)》,主要两个目的,一是便于自己复习,二是帮助团队其他同学更好的学习成长。

    前面几章,我们已经把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核心编程》第十章内容,谢谢。

共有 人打赏支持
东方神剑
粉丝 61
博文 126
码字总数 93166
×
东方神剑
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: