鱼C论坛

 找回密码
 立即注册
查看: 2051|回复: 0

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

[复制链接]
发表于 2017-9-12 17:14:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

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

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 09:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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