除法 close 对象 clas bre *** 主动 程序
Python 用异常对象来表示异常情况,如果异常对象未被处理或捕捉,程序就会回溯(traceback)中止执行。
异常可以在出错时自动引发,也可以主动引发。
异常被引发后如果不被处理就会传播至程序调用的地方,直到主程序(全局作用域),如果主程序仍然没有异常处理,程序会带着栈跟踪终止。
raise:引发异常
- >>> raise Exception
- Traceback (most recent call last):
- File "<pyshell#1>", line 1, in <module>
- raise Exception
- Exception
>>> raise Exception("error!!!")
Traceback (most recent call last):
File "
raise Exception("error!!!")
Exception: error!!!
常见内建异常类:
类名 | 描述 |
Exception | 所有异常的基类 |
AttributeError | 特性引用或赋值失败时引发 |
IOError | 试图打开不存在文件(包括其他情况)时引发 |
IndexError | 在使用序列中不存在的索引时引发 |
KeyError | 使用映射中不存在的键引发 |
NameError | 找不到名字(变量)时引发 |
SyntaxError | 在代码为错误形式时引发 |
TypeError | 在内建操作或者函数应用于错误类型的对象引发 |
ValueError | 在内建操作或者函数应用于正确的对象,但是该对象使用不合适的值引发 |
ZeroDivision | 在除法或者模除操作的第二个参数为 0 时引发 |
自定义异常类:继承自 Exception
- class DefException(Exception) : pass
捕捉异常:使用 try/except 语句实现 >>> try:
- x = int(input("The first num:"))
- y = int(input("The second num:"))
- print(x/y)
- except ZeroDivisionError:
- print("Error")
- The first num:5
- The second num:0
- Error
- >>> try:
- x = int(input("The first num:"))
- y = int(input("The second num:"))
- print(x/y)
- except ZeroDivisionError:
- print("Error")
- except ValueError:
- print("TypeError")
- The first num:5
- The second num:o
- TypeError
用一个块捕捉多个异常:
- >>> try:
- x = int(input("The first num:"))
- y = int(input("The second num:"))
- print(x/y)
- except (ZeroDivisionError,ValueError):
- print("Error")
- The first num:5
- The second num:0
- Error
捕捉对象:
- >>> try:
- x = int(input("The first num:"))
- y = int(input("The second num:"))
- print(x/y)
- except (ZeroDivisionError,ValueError) as e:
- print(e)
- The first num:5
- The second num:0
- division by zero
捕捉所有异常:
- try:
- x = int(input("The first num:"))
- y = int(input("The second num:"))
- print(x/y)
- except:
- print("some errors")
- The first num:5
- The second num:
- some errors
这种方式会捕捉用户中止执行的企图,会隐藏所有程序员未想到并且未做好准备的错误。
对于异常情况进行处理:
- #在输入不合法时循环,直到合法值出现退出循环
- while True:
- try:
- x = int(input("The first num:"))
- y = int(input("The second num:"))
- print(x/y)
- except:
- print("Error")
- else:
- break
- #运行结果
- The first num:5
- The second num:0
- Error
- The first num:6
- The second num:3
- 2.0
finally 子句:用在可能的异常后进行清理,不管是否有异常都要执行。在同一个 try 语句中,不可以和 except 使用。
- x = None
- try:
- x = 1/0
- finally:
- print("cleaning")
- del x
- #结果
- cleaning
- Traceback (most recent call last):
- File "input.py", line 4, in <module>
- x = 1/0
- ZeroDivisionError: division by zero
- ***Repl Closed***
可以在一条语句中组合使用 try,except,else,finally
- try:
- x = 1/0else:
- print("done")
- finally:
- print("cleaning")
- #运行结果
- cleaning
- ***Repl Closed***
Python 学习笔记之异常
来源: http://www.bubuko.com/infodetail-2276405.html