QQ登录

只需一步,快速开始

登录 | 立即注册 | 找回密码

主题

帖子

荣誉

VIP至尊会员

Rank: 15Rank: 15Rank: 15

积分
234
查看: 120|回复: 0

[学习笔记] 《零基础入门学习Python》032异常处理:你不可能总是对的

[复制链接]
最佳答案
0 
累计签到:105 天
连续签到:1 天
1137381680 发表于 2017-9-12 17:14:56 1200 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 1137381680 于 2017-9-12 21:32 编辑

《零基础入门学习Python》

——学习笔记

032异常处理:你不可能总是对的

这次的笔记格式又不同了。本来这一节不准备做笔记的,但是有种强迫症的感觉,所以还是做吧。这一节课主要是讲程序在运行异常时所报出的错误。之前的笔记我有过分析,今天看了小甲鱼老师的课感觉我和老师心有灵犀呀!这节笔记我打算用配合实例的方式演示每一个错误。

1.AssertionError:断言语句失败
  1. #举例子
  2. >>> assert 1 > 2
  3. [color=Red]Traceback (most recent call last):
  4.   File "<pyshell#10>", line 1, in <module>
  5.     assert 1 > 2
  6. AssertionError
  7. [/color]
复制代码
2.AttributeError:尝试访问未知的对象属性
  1. #举例子
  2. >>> list.abcd
  3. [color=Red]Traceback (most recent call last):
  4.   File "<pyshell#11>", line 1, in <module>
  5.     list.abcd
  6. AttributeError: type object 'list' has no attribute 'abcd'
  7. [/color]
复制代码
3.EOFError:用户输入文件末尾标志EOF(Ctrl+d)

这个错误比较抽象,简单讲解一下。看名字翻译过来就是EOF错误。EOF的定义是表示资料源无更多的资料可读取,我的理解就是在文件中贴一个结束的标签,有点像电影放完后the end那个感觉。在python中,ctrl+d是结束运行当前代码的快捷键。
  1. #举例子
  2. lst = []
  3. s = 's'
  4. while(True):
  5.     try:
  6.         s = input('please input:')
  7.         lst.append(s)
  8.     except Exception as ex:
  9.         print(ex)
  10.         break
  11. print(lst)
复制代码
执行后是这样
  1. >>>
  2. please input:の
  3. please input:4
  4. please input:5
  5. please input:(如果在这里按ctrl+d)
  6. EOF when reading a line
  7. ['の', '4', '5']
复制代码
*例子中的代码感谢百度阳光的雷咩咩提供。

4.FloatingPointError:浮点计算错误

#举例子暂无

5.GeneratorExit:Generator.close()方法被调用的时候

#举例子暂无

6.ImportError:导入模块失败的时候
  1. #举例子
  2. >>> import abcd
  3. [color=Red]Traceback (most recent call last):
  4.   File "<pyshell#1>", line 1, in <module>
  5.     import abcd
  6. ImportError: No module named 'abcd'
  7. [/color]
复制代码
7.IndexError:索引超出序列的范围
  1. #举例子
  2. >>> lista = ['a','b','c','d']
  3. >>> lista[4]
  4. [color=Red]Traceback (most recent call last):
  5.   File "<pyshell#5>", line 1, in <module>
  6.     lista[4]
  7. IndexError: list index out of range
  8. [/color]
复制代码
8.KeyError:字典中查找一个不存在的关键数
  1. #举例子
  2. >>> dict1 = {'a':1,'b':2,'c':3,'d':4}
  3. >>> dict1['e']
  4. [color=Red]Traceback (most recent call last):
  5.   File "<pyshell#12>", line 1, in <module>
  6.     dict1['e']
  7. KeyError: 'e'
  8. [/color]
复制代码
9.KeyboardInterrupt:用户输入中断键Ctrl+c
  1. #举例子
  2. a = 1
  3. while a > 0:
  4.     a = a + 1
  5.     print(a)
  6. else:
  7. print(GG)
复制代码
#此时点击运行
  1. 2
  2. 3
  3. 4
  4. 5
  5. 6(现在我按下ctrl + c)
  6. [color=Red]Traceback (most recent call last):
  7.   File "C:/Users/徐鑫/Desktop/1212.py", line 4, in <module>
  8.     print(a)
  9.   File "E:\Program Files\lib\idlelib\PyShell.py", line 1318, in write
  10.     return self.shell.write(s, self.tags)
  11. KeyboardInterrupt
  12. [/color]
复制代码
10.MemoryError:内存溢出

其实这个例子本来不想举的,因为没达到我要的效果。在python第六讲里的课后作业1小甲鱼老师提过通过幂次项运算可以使电脑内存不足,但是我运行后等了很长时间程序只是未响应,并未提示内存溢出。可能是我加了内存一时半会占用不完。我把代码附上,以后若有更好例子再进行修改。
  1. #举例子
  2. >>> print(999**999**999**999)
  3. [color=Red]MemoryError:Memory Overflow[/color](虽然我这里并未提示)
复制代码

11.NameError:尝试访问一个不存在的变量
  1. #举例子
  2. >>> import random
  3. >>> a = random.randint(1,100)
  4. >>> print(b)
  5. [color=Red]Traceback (most recent call last):
  6.   File "<pyshell#11>", line 1, in <module>
  7.     print(b)
  8. NameError: name 'b' is not defined
  9. [/color]
复制代码
12.NotImplementedError:尚未实现的方法
#举例子暂无

13.OSError:操作系统产生的异常
  1. #举例子
  2. 在这里我举的是文件不存在的异常
  3. >>> lista = []
  4. >>> pickle_file = open('memorys.pkl','wb')
  5. >>> pickle.dump(lista,memorys.pkl)
  6. >>> pickle_file.close()
  7. >>> pickle_file = open('memorys.pkl','rb')
  8. >>> memorys2 = pickle.load(pickle_file)
  9. >>> print(memorys2)
  10. []
复制代码
在这之前我们能看到之前的操作都是有效的。
在这个时候,我用文件粉碎机把memorys.pkl删除了(正常删除是删不掉的,因为当时python正在占用)。然后我们执行这个命令
  1. >>> memorys2 = pickle.load(pickle_file)
  2. [color=Red]Traceback (most recent call last):
  3.   File "<pyshell#17>", line 1, in <module>
  4.     memorys2 = pickle.load(pickle_file)
  5. OSError: [Errno 9] Bad file descriptor
  6. [/color]
复制代码
这里显示文件找不到了。

14.OverflowError:数值运算超出最大限制
#举例子暂无

15.ReferenceError:弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象
#举例子暂无

16.RuntimeError:一般的运行时错误
#举例子暂无

17.StopIteration:迭代器没有更多的值
在举这个例子之前我需要先讲一下要用到的知识。
(1). iter(object): object必须是集合对象,且支持迭代协议(iteration protocol)或者支持序列协议(sequence protocol)。
  1. lst = [1, 2, 3]
  2. for i in iter(lst):
  3.         print(i)
复制代码
  1. 1
  2. 2
  3. 3
复制代码
*注:此例子引用于博客园的飞·羽大神的Python3 iter函数用法简述,感谢!

(2). next(iterator[, default]): 函数必须接收一个可迭代对象参数,每次调用的时候,返回可迭代对象的下一个元素。如果所有元素均已经返回过,则抛出StopIteration 异常
*注:此例子引用于〖十月狐狸〗大神的Python内置函数(44)--next,感谢!
  1. #举例子
  2. re = iter(list(range(5)))

  3. for i in range(100):

  4.     print(next(re))
复制代码
首先range(5)中包括0,1,2,3,4五个数字,也就是说re这个对象只能被执行五次的next(re),当超过五次后就会出现如下错误
  1. >>>
  2. 0
  3. 1
  4. 2
  5. 3
  6. 4
  7. [color=Red]Traceback (most recent call last):
  8.   File "C:\Users\徐鑫\Desktop\1.py", line 3, in <module>
  9.     print(next(re))
  10. StopIteration
  11. [/color]
复制代码
*注:此代码为博客园Vamei大神的代码,由于python3的特性,我在此代码上做了部分修改以能够运行,感谢!

18.SyntaxError:Python的语法错误
  1. #举例子
  2. >>> list.import
  3. [color=Red]SyntaxError: invalid syntax
  4. [/color]
复制代码
19.IndentationError:缩进错误

我在进行测试时发现在我的python3.3.2中,虽然在缩进错误时依然有unexpected indent的提示,但是这个错误却归在了SyntaxError的下面,而不是网上的IndentationError下面,我不知道是否是版本的更新导致还是我错误没弄对导致,我暂且先放在上面。
  1. #举例子
  2. >>>  print('hello')#注意,print前面有两个空格

  3. [color=Red]SyntaxError: unexpected indent[/color]
复制代码
20.TabError:Tab和空格混合使用
#举例子暂无

21.SystemError:Python编译器系统错误、
#举例子暂无

22.SystemExit:Python编译器进程被关闭
#举例子暂无

23.TypeError:不同类型间的无效操作
  1. #举例子
  2. >>> 3 + 'abc'
  3. [color=Red]Traceback (most recent call last):
  4.   File "<pyshell#3>", line 1, in <module>
  5.     3 + 'abc'
  6. TypeError: unsupported operand type(s) for +: 'int' and 'str'
  7. [/color]
复制代码
24.UnboundLocalError:访问一个未初始化的本地变量(NameError的子类)

按我的话理解就是本来你在外面定义了一个变量并为其赋了值,但在函数中引用时你却没有用全局变量声明,导致被访问的变量出现了不对等的情况。
  1. #举例子:
  2. val=9
  3. def test(flag):
  4.     if flag:
  5.         val = 1
  6.     else:
  7.         print ('test')
  8.     return val

  9. test(0)
复制代码
运行后:
  1. >>> test
  2. [color=Red]Traceback (most recent call last):
  3.   File "C:\Users\徐鑫\Desktop\1.py", line 9, in <module>
  4.     test(0)
  5.   File "C:\Users\徐鑫\Desktop\1.py", line 7, in test
  6.     return val
  7. UnboundLocalError: local variable 'val' referenced before assignment
  8. [/color]
复制代码
(如果想运行正常的话在‘if flag:’之前加上global val就可以了)

25.ValueError:传入无效参数
  1. #举例子
  2. >>> int('tab')
  3. [color=Red]Traceback (most recent call last):
  4.   File "<pyshell#0>", line 1, in <module>
  5.     int('tab')
  6. ValueError: invalid literal for int() with base 10: 'tab'
  7. [/color]
复制代码
26.ZeroDivisionError:除数为零
  1. #举例子
  2. >>> 7/0
  3. [color=Red]Traceback (most recent call last):
  4.   File "<pyshell#1>", line 1, in <module>
  5.     7/0
  6. ZeroDivisionError: division by zero
  7. [/color]
复制代码
*注1:在这里对Unicode的错误不做讨论
*注2:部分错误由于本人没学到或者一般难以遇到所以暂未找到好的例子进行解释,若以后有了例子会进行补充。如果有朋友能对其中没有例子的错误提供粒子的话,请在下方发贴,我会置顶并感谢,如有错误请多指教。
python标准异常总结2.JPG
python标准异常总结1.JPG

本帖被以下淘专辑推荐:

1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
楼层
跳转到指定楼层

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐 上一条 /3 下一条

    移动客户端下载(未启用)
    微信公众号

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备11014136号

Copyright 2018 鱼C论坛 版权所有 All Rights Reserved.

Powered by Discuz! X3.1 Copyright
© 2001-2018 Comsenz Inc.    All Rights Reserved.

小黑屋|手机版|Archiver|鱼C工作室 ( 粤公网安备 44051102000370号 | 粤ICP备11014136号

GMT+8, 2017-11-21 23:28

快速回复 返回顶部 返回列表