学习九-python 异常处理

时间:2022-12-12 19:43:59

所谓的异常简单来讲就是程序出现逻辑错误或者用户不合法的输入。常见的比如一个列表索引超出了列表的索引范围,打开一个文件时文件名输入错误系统找不到文件等等。

常见的异常

AssertionError: 断言(assert)语句失败

当assert关键字后面的条件不为真使,程序就会抛出AssertionError异常。
看一个例子:

>>> mylist = ["python"]
>>> assert len(mylist)>0
>>> mylist.pop()
'python'
>>> assert len(mylist)>0
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    assert len(mylist)>0
AssertionError
>>> mylist
[]

使用内置函数pop()将列表中的元素弹出后,该元素将不再在列表中。

AttributeError:表示访问未知的对象属性

>>> mylist = ["python"]
>>> mylist.java
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    mylist.java
AttributeError: 'list' object has no attribute 'java'

由于j’ava对象不存在,所以会抛出异常。

IndexError :索引超出序列的范围

>>> examplelist = ['a','b' ,'c']
>>> examplelist
['a', 'b', 'c']
>>> examplelist[3]
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    examplelist[3]
IndexError: list index out of range
>>> 

KeyError:字典中查获找一个不存在的键

>>> exampledict = {"a":1,"b":2,"c":3}
>>> exampledict
{'a': 1, 'b': 2, 'c': 3}
>>> exampledict["a"]
1
>>> exampledict["d"]
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    exampledict["d"]
KeyError: 'd'

字典中键“d”不存在,索引不到,抛出异常。

NameError:尝试访问一个不存在的变量

>>> examplelist = ['a','b' ,'c']
>>> examplelist
['a', 'b', 'c']
>>> alist
Traceback (most recent call last):
  File "<pyshell#21>", line 1, in <module>
    alist
NameError: name 'alist' is not defined

由于直接访问的变量 alist并没有像变量 examplelist 那样先定义就访问了,这个变量是不存在的,所以抛出异常。

OSError: 操作系统产生的异常

打开一个不存在的文件就会抛出FileNotFoundError异常,该异常属于OSError的一个子类。

>>> fname = input("input a file name:")
input a file name:example.txt
>>> f=open(fname,'r')
Traceback (most recent call last):
  File "<pyshell#24>", line 1, in <module>
    f=open(fname,'r')
FileNotFoundError: [Errno 2] No such file or directory: 'example.txt'

SyntaxError: 语法错误

初学者见得最多的错误吧。比如在定义一个字典时写成下面的样子:

exampledict = {"a"=1,"b"=2,"c"=3}
SyntaxError: invalid syntax

python没有这样的语法。字典其中一种定义方式应该这样的 exampledict = {“a”:1,”b”:2,”c”:3}

TypeError:不同类型间的无效操作

这种错误常发生在计算或者复制中。如下一个整形和一个字符的相加操作。

>>> examplelist = ['a','b','c']
>>> exampledict = {"a":1,"b":2,"c":3}
>>> examplelist[1]+exampledict["a"]
Traceback (most recent call last):
  File "<pyshell#27>", line 1, in <module>
    examplelist[1]+exampledict["a"]
TypeError: must be str, not int

还有很多这里不一一举例

遇到异常时不要慌,问题总是能解决的。

异常的捕获

try-except

try:
    需要检测的程序段
except Exception [as reason]:
    异常处理方法

可以在一个try后面跟着多个except说不同的异常经行处理。

try:
    需要检测的程序段
except TypeError as reason:
    异常处理方法1
except TypeError as reason:
    异常处理方法2

捕获所有异常:

try:
    需要检测的程序段
except:
    异常处理方法

try-finally

使用finally给用户有挽回的余地,如果出现异常,则会想执行except中的异常处理,接着到finally中的处理。如果没有运行异常,则直接到finally中处理。比如你打开了一个文件,但是你关闭之前的其他操作造成了异常,那么程序将直接跳到except中处理异常了,那文件没有关闭怎么办,这时finally就起作用了。但except中异常处理完之后,接着就是到finally中进行异常处理,finally中的异常处理一定会被执行的。

try:
    需要检测的程序段
except:
    异常处理方法
finally:
    异常处理方法

with语句

with语句会自动帮助关闭打开的文件。
这里直接摘取自小甲鱼的书中的代码:

try:
    f = open('data.txt','w')
    for each_line in f:
        print(each_line)
except OSError as reason:
            print('error:'+str(reason))
finally:
    f.close()
try:
    with open('data.txt','w') as f:
    for each_line in f:
        print(each_line)
except OSError as reason:
            print('error:'+str(reason))

制造异常并抛出 raise语句

>>> raise TypeError
Traceback (most recent call last):
  File "<pyshell#28>", line 1, in <module>
    raise TypeError
TypeError
>>> raise TypeError("还能带参数对你抛出异常做更详细的解释")
Traceback (most recent call last):
  File "<pyshell#29>", line 1, in <module>
    raise TypeError("还能带参数对你抛出异常做更详细的解释")
TypeError: 还能带参数对你抛出异常做更详细的解释

这是学习笔记,不是只是“看起来认真”,就在这里做一些记录,参考 小甲鱼,清华出版社《零基础入门学习Python》。