Python异常处理
异常与错误的区别
在介绍异常处理之前就不能不说一下异常和错误的区别了:
错误有两种:
- 语法错误:代码不符合解释器或者编译器语法
- 逻辑错误:不完整或者不合法输入或者计算出现问题
这些错误都会使程序崩掉。异常是程序运行时发生错误而产生的信号,由解释器追踪而抛出。异常不一定是坏的,它可能是我们主动抛出的,但有些异常是解释器自动抛出的、我们无法预测用户会做什么(除非限制得很死)他们操作时也可能产生异常。因此我们要捕捉异常,并做相应的处理。
一般形式
先看一看异常处理的简单形式:
try:
<代码1>
except <什么异常> [as <变量名>]:
<代码2>
首先程序会执行代码1,假如代码1执行过程中抛出异常了,那么就会去except中的异常哪里确认,抛出是否为你要捕捉的异常(except后面的异常)(包括是否为子类),假如是的话就会执行代码2,不是的话就继续往上冒泡,直到被处理否则解释器就会报错,整个程序就会退出。
下面展示一个小例子,对用户输入的数据进行类型转化
name = input("name>>>")
age = input("age>>>")
while True:
try:
print("start type %s \n" % type(age))
age = int(age)
break
except ValueError as e:
print(type(e))
print(e)
age = input("age>>>")
print("end type%s \n" % type(age))
print(name)
print(age)
# ############ 以下是命令行输入############
"""
name>>>Jack
age>>>sb
start type <class 'str'>
<class 'ValueError'> # e的类型为异常的类
invalid literal for int() with base 10: 'sb' # ,明显我输入的sb不能被转化为int类型
age>>>22
start type <class 'str'>
end type<class 'int'>
Jack
22
Process finished with exit code 0 # 程序正常退出
"""
上面展示的:只有用户输入数字才会正常运行,否则就会抛出异常ValueError我们可以选择捕捉它,然后做异常处理。直到输入的是正确的。
注:除了上述一样定义的e包含错误信息外,python的标准库sys也有这样的方法,那就是:sys.exc_info()
else
在异常处理的else表示的是在不抛出异常时执行。
a = "12"
b = Nonetry:
b = int(a)
except ValueError as e:
b = 111
else:
print(a, b)
finally
finally在英语中有终于、 最终的意思,在python中finally表示的是无论有没有异常,它都会执行(注:有异常时,必须要捕捉了异常,否者定义finally也不会被执行)。如下所示:
name = input("name>>>")
age = input("age>>>")
try:
age = int(age)
except ValueError:
print("ValueError ... ")
finally:
print("finally ... ")
print(name, age)
# ########################
"""
# 第一次输入
name>>>Jack
age>>>sb
ValueError ...
finally ...
Jack sb
# 第二次输入
name>>>Tony
age>>>19
finally ...
Tony 19
"""
正如示例所示,无论我是否输入错了,都会打印 "finally ... ",证明了上面说的:无论异常还是正常的,finally都会执行。最后想展示以下python的一些常见异常类,以及它们的关系。避免以后只会except Exception,,这样会使得代码维护困难。先上一张图片,主要是想展示它们之间的关系,只画了部分,有些异常类我就没有画出(主要是不知道)。
给一个表说明一下这些常见的异常类对应着什么样的异常
异常类 | 解释 |
---|---|
StopIteration | 迭代器迭代完之后抛出的异常 |
AttributeError | 使用对象调用不存在的方法时抛出 |
ImportError | 导入找不到模块,或在模块中找不到名称时抛出,其子类ModuleNotFoundError也有类似的意义 |
ValueError | 传入的值不对 |
TypeError | 参数类型不正确 |
IndexError | 索引错误,通常是索引超出范围 |
KeyError | 键错误,一般是键输错了 |
本文来自博客园,作者:403·Forbidden,转载请注明原文链接:https://www.cnblogs.com/lczmx/p/12213776.html