python异常处理

在介绍异常处理之前就不能不说一下异常和错误的区别了:

错误有两种:

  1.语法错误:代码不符合解释器或者编译器语法

  2.逻辑错误:不完整或者不合法输入或者计算出现问题

这些错误都会使程序崩掉。

异常是程序运行时发生错误而产生的信号,由解释器追踪而抛出。

异常不一定是坏的,它可能是我们主动抛出的,但有些异常是解释器自动抛出的、我们无法预测用户会做什么(除非限制得很死)他们操作时也可能产生异常。因此我们要捕捉异常,并做相应的处理。

  一般形式

先看一看异常处理的简单形式:

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,,这样会使得代码维护困难

   先上一张图片,主要是想展示它们之间的关系,只画了部分,有些异常类我就没有画出(主要是不知道)

python异常处理

   给一个表说明一下这些常见的异常类对应着什么样的异常

异常类 解释
StopIteration迭代器迭代完之后抛出的异常
AttributeError使用对象调用不存在的方法时抛出
ImportError导入找不到模块,或在模块中找不到名称时抛出,其子类ModuleNotFoundError也有类似的意义
ValueError传入的值不对
TypeError参数类型不正确
IndexError索引错误,通常是索引超出范围
KeyError键错误,一般是键输错了

相关推荐