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 传入的对象类型与要求不符

 

posted @ 2020-03-02 15:49  小虫虫大虫虫  阅读(210)  评论(0编辑  收藏  举报