第三十二讲:异常处理,你不可能总是对的1
一、知识点:
0.python标准异常总结
AssertionError | 断言语句(assert)失败 |
AttributeError | 尝试访问未知的对象属性 |
EOFError | 用户输入文件末尾标志EOF(Ctrl+d) |
FloatingPointError | 浮点计算错误 |
GeneratorExit | generator.close()方法被调用的时候 |
ImportError | 导入模块失败的时候 |
IndexError | 索引超出序列的范围 |
KeyError | 字典中查找一个不存在的关键字 |
KeyboardInterrupt | 用户输入中断键(Ctrl+c) |
MemoryError | 内存溢出(可通过删除对象释放内存) |
NameError | 尝试访问一个不存在的变量 |
NotImplementedError | 尚未实现的方法 |
OSError | 操作系统产生的异常(例如打开一个不存在的文件) |
OverflowError | 数值运算超出最大限制 |
ReferenceError | 弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象 |
RuntimeError | 一般的运行时错误 |
StopIteration | 迭代器没有更多的值 |
SyntaxError | Python的语法错误 |
IndentationError | 缩进错误 |
TabError | Tab和空格混合使用 |
SystemError | Python编译器系统错误 |
SystemExit | Python编译器进程被关闭 |
TypeError | 不同类型间的无效操作 |
UnboundLocalError | 访问一个未初始化的本地变量(NameError的子类) |
UnicodeError | Unicode相关的错误(ValueError的子类) |
UnicodeEncodeError | Unicode编码时的错误(UnicodeError的子类) |
UnicodeDecodeError | Unicode解码时的错误(UnicodeError的子类) |
UnicodeTranslateError | Unicode转换时的错误(UnicodeError的子类) |
ValueError | 传入无效的参数 |
ZeroDivisionError | 除数为零 |
--------------------------------------------------------------------我是一条分割线----------------------------------------------------------------------
二、课后作业:
0.结合你自身的编程经验,总结下异常处理机制的重要性?
答:由于环境的不确定性和用户操作的不可以预知性都可能导致程序出现各种问题,因此异常机制最重要的无非就是:增强程序的健壮性和用户体验,尽可能的捕获所有预知的异常并写好处理的代码,当异常出现的时候,程序自动消化并恢复正常(不至于崩溃)。
1.请问以下代码是否会产生异常,如果会的话,请写出异常的名称:
>>> my_list = [1, 2, 3, 4,,]
答:语法错误,SyntaxError: invalid syntax
2.请问以下代码是否会产生异常,如果会的话,请写出异常的名称:
>>> my_list = [1, 2, 3, 4, 5]
>>> print(my_list[len(my_list)])
答:索引超出序列的范围,IndexError。
3.请问以下代码是否会产生异常,如果会的话,请写出异常的名称:
>>> my_list = [3, 5, 1, 4, 2]
>>> my_list.sorted()
答:尝试访问未知的对象属性,AttributeError: 'list' object has no attribute 'sorted'
4. 请问以下代码是否会产生异常,如果会的话,请写出异常的名称:
>>> my_dict = {'host': 'http://bbs.fishc.com', 'port': '80'}
>>> print(my_dict['server'])
答:尝试访问字典中一个不存在的“键”引发 KeyError: 'server' 异常,为了避免这个异常发生,可以使用 dict.get() 方
法。
5. 请问以下代码是否会产生异常,如果会的话,请写出异常的名称:
def my_fun(x, y):
print(x, y)
f(x=1, 2)
答: SyntaxError:positional argument follows keyword argument。关键字参数必须跟随在位置参数后面。
6.请问以下代码是否会产生异常,如果会的话,请写出异常的名称:
f = open('C:\\test.txt', wb)
f.write('I love FishC.com!\n')
f.close()
答:注意 open() 第二个参数是字符串,应该 f = open('C:\\test.txt', 'wb') 。wb不加双引号 Python 还以为是变量名
呢,往上一找,艾玛没找着……引发 NameError 异常。由于打开文件失败,接着下边一连串与 f 相关的均会报同样异
常。
7.请问以下代码是否会产生异常,如果会的话,请写出异常的名称:
def my_fun1():
x = 5
def my_fun2():
x *= x
return x
return my_fun2()
my_fun1()
答:Python 认为在内部函数的 x 是局部变量的时候,外部函数的 x 就被屏蔽了起来,所以执行 x *= x 的时候,在右边根本就找不到局部变量 x 的值,因此报错。可以改为:
def my_fun1():
x = 5
def my_fun2():
nonlocal x
x *= x
return x
return my_fun2()
my_fun1()
--------------------------------------------------------------------我是一条分割线----------------------------------------------------------------------