笔记:
参考:
http://blog.csdn.net/junwei0206/article/details/45037727
http://blog.csdn.net/junwei0206/article/details/45042965
1、 try语句:
try:
检测范围
except Exception[as reason]:
出现异常(Exception)后的处理代码 ,比如:print(“打印提示,出错啦:”+ “str(reason)”)
2、 try-finally语句:
try:
检测范围
except Exception[as reason]:
出现异常(Exception)后的处理代码
finally:
无论如何都会被执行的代码
3、 raise语句:
raise 异常的名字
>>> raise ZeroDivisionError('除数为零的异常')
<span style="color:#ff0000;">Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
raise ZeroDivisionError('除数为零的异常')
ZeroDivisionError: 除数为零的异常</span>
练习题:
1.请问以下代码是否会产生异常,如果会的话,请写出异常的名称:
>>> 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 异常。
2.请问以下代码是否会产生异常,如果会的话,请写出异常的名称:
>>> my_list = [3, 5, 1, 4, 2]
>>> my_list.sorted()
答:初学者容易疏忽的错误,列表的排序方法叫 list.sort(),sorted() 是BIF。因此会引发 AttributeError: ‘list’ object has no attribute ‘sorted’ 异常。
3.请问以下代码是否会产生异常,如果会的话,请写出异常的名称:
>>> 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】不存在!’)
4.请问以下代码是否会产生异常,如果会的话,请写出异常的名称:
def my_fun(x, y):
print(x, y)
f(x=1, 2)
答:如果使用关键字参数的话,需要两个参数均使用关键字参数 f(x=1, y=2)
5.请问以下代码是否会产生异常,如果会的话,请写出异常的名称:
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 相关的均会报同样异常。
6.请问以下代码是否会产生异常,如果会的话,请写出异常的名称:
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()
**PS:
以下是 Python 内置异常类的层次结构:**