python异常处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,,这样会使得代码维护困难

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

 

 

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

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

 

以上是关于python异常处理的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

python常用代码片段总结

使用片段中的处理程序时出现非法状态异常

你如何在 python 中处理 graphql 查询和片段?

Java异常处理机制

java 反射代码片段