python - 异常
Python用异常对象(exception object)来表示异常情况。遇到错误后,会引发异常。如果异常对象并未被处理或捕捉,则程序就会用所谓的回溯(traceback)来终止执行。
大多数错误会引发异常,但异常不一定代表错误,有时只是一个警告,有时只是一个终止信号,例如退出循环等
常见异常处理语法如下:
- try... except....
- try... except... else...
- try... except... finally...
另外讲解以下内容:
- with语句
- raise(主动抛出异常)
- 常见异常
下面分别介绍:
1. try... except....
将可能出错的代码放在try中,将异常处理代码放在except中
打开一个不存在的文件,捕获这个异常,打印出一行字
1 try: 2 f = open('nothing.txt', 'rt') 3 except FileNotFoundError: 4 print('异常了')
所有的异常类,都继承自Exception类,Exception类继承自BaseException类(基类)。所有我们也可以用Exception或BaseException来接收所有类型的异常
也可以使用基类捕获异常
1 try: 2 f = open('nothing.txt', 'rt') 3 except Exception: # 或BaseException 4 print('异常了')
以上都是异常时打印文字,但如何准确知道是那一行代码出了问题,使用as msg
打印详细的异常原因
1 try: 2 print(aa) 3 f = open('nothing.txt', 'rt') 4 except Exception as msg: # 定义msg变量,用于接收异常信息,并在下面通过print打印 5 print(msg) # 会打印:name 'aa' is not defined
异常时,跳过,什么也不打印也不处理
1 try: 2 print(aa) 3 except: 4 pass
2. try... except... else...
没有异常时的代码,放在else中
1 try: 2 my_string = input('请输入几个字符') 3 except EOFError: # ctrl+d,会引发此异常 4 print('输入被强制中断了') 5 else: 6 print('没有异常!这是你刚才输入的字符:', my_string)
3. try... except... finally...
不管是否出现异常,都会执行的代码,放在finally中
例如:文件的关闭、锁的释放、把数据库的连接返还给连接池等操作
1 try: 2 f = open('abc.txt', 'rt') # 正常打开一个已存在的文件 3 print(aa) 4 except Exception as msg: 5 print(msg) # 捕获异常,打印:name 'aa' is not defined 6 finally: 7 f.close() 8 print('关闭文件') # 不管是否有异常,都会执行,关闭文件,并打印:关闭文件
4. with语句
一般在try中获取资源,在finally中释放资源。另一个更简洁的语法是with语句
传统的try...finally...:
1 try: 2 f = open('123.txt', 'rt') 3 while True: 4 content = f.readline() 5 print(content, end=' ') 6 if len(content) == 0: 7 break 8 finally: 9 f.close()
简洁的with:
1 with open('123.txt') as f: # 将关闭文件的操作由with open来完成 2 for line in f: 3 print(line, end=' ')
5. raise(主动抛出异常)
通过raise语句来抛出异常
1 class ShortInputException(Exception): # 1.定义异常类,继承自Exception 2 def __init__(self, length, atleat): 3 self.legth = length 4 self.atleast = atleat 5 6 try: 7 text = input('请输入一些字符:') 8 if len(text) < 3: 9 raise ShortInputException(len(text), 3) # 2.抛出异常 10 except EOFError: 11 print('被手动终止') 12 except ShortInputException as ex: # 3.接收异常 13 print('expect at least {}, but your input is{}'.format(ex.atleast, ex.legth))# 4.使用异常对象的atleast和legth字段来打印错误信息
6. 常见异常
BaseException 新的所有异常类的基类
Exception 所有异常类的基类,但继承自BaseException类
AssertionError assert语句失败
FileNotFoundError 试图打开一个不存在的文件或目录
AttributeError 试图访问的对象没有属性
OSError 系统错误,如磁盘已满等
NameError 使用一个还未赋值的变量
IndexError 当一个序列超出了范围
SyntaxError 语法错误
KeyboardInterrupt Ctrl+c
TypeError 传入的对象类型与要求不符