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

请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式!

                      ***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迭代器没有更多的值
SyntaxErrorPython的语法错误
IndentationError缩进错误
TabErrorTab和空格混合使用
SystemErrorPython编译器系统错误
SystemExitPython编译器进程被关闭
TypeError不同类型间的无效操作
UnboundLocalError访问一个未初始化的本地变量(NameError的子类)
UnicodeErrorUnicode相关的错误(ValueError的子类)
UnicodeEncodeErrorUnicode编码时的错误(UnicodeError的子类)
UnicodeDecodeErrorUnicode解码时的错误(UnicodeError的子类)
UnicodeTranslateErrorUnicode转换时的错误(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)])

答:len(my_list) 是获得列表的长度,这里长度为5,该列表各个元素的访问索引号分别是:[0, 1, 2, 3, 4],因此试图访问 my_list(5) 会引发 IndexError: list index out of range 异常。

3. 请问以下代码是否会产生异常,如果会的话,请写出异常的名称:

my_list = [3, 5, 1, 4, 2]
my_list.sorted()

答:初学者容易疏忽的错误,列表的排序方法叫 list.sort(),sorted() 是BIF。因此会引发 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() 方法:

if not my_dict.get('server'):

        print('您所访问的键【server】不存在!')

5. 请问以下代码是否会产生异常,如果会的话,请写出异常的名称:

def my_fun(x, y):
        print(x, y)
my_fun(x=1, 2)

答:SyntaxError: positional argument follows keyword argument
解决:如果使用关键字参数的话,需要所有参数均使用关键字参数 my_fun(x=1, y=2),而且这里关键字参数位于位置参数前面

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 相关的均会报同样异常。

  1. 请问以下代码是否会产生异常,如果会的话,请写出异常的名称:
def my_fun1():
        x = 5
        def my_fun2():
                x *= x
                return x
        return my_fun2()
my_fun1()

答:闭包的知识大家还记得不? Python 认为在内部函数的 x 是局部变量的时候,外部函数的 x 就被屏蔽了起来,所以执行 x *= x 的时候,在右边根本就找不到局部变量 x 的值,因此报错。

在 Python3 之前没有直接的解决方案,只能间接地通过容器类型来存放,因为容器类型不是放在栈里,所以不会被“屏蔽”掉。容器类型这个词儿大家是不是似曾相识?我们之前介绍的字符串、列表、元祖,这些啥都可以往里的扔的就是容器类型啦。

def my_fun1():

        x = [5]

        def my_fun2():

                x[0] *= x[0]

                return x[0]

        return my_fun2()

my_fun1()

但是到了 Python3 的世界里,又有了不少的改进,如果我们希望在内部函数里可以修改外部函数里的局部变量的值,那么也有一个关键字可以使用,就是 nonlocal:

def my_fun1():

        x = 5

        def my_fun2():

                nonlocal x

                x *= x

                return x

        return my_fun2()

my_fun1()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值