• 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 
    " % type(age))
            age = int(age)
            break
        except ValueError as e:
            print(type(e))
            print(e)
            age = input("age>>>")
    
    print("end type%s 
    " % 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 键错误,一般是键输错了

     

  • 相关阅读:
    Nginx入门
    Spring基础知识汇总 Java开发必看
    java ArrayList倒序
    1
    js event 的target 和currentTarget
    java 文件的写入和读取
    DOMContentLoaded与load的区别
    JS中先有Object还是先有Function?
    JSON.stringify的三个参数
    Java的泛型约束和限制
  • 原文地址:https://www.cnblogs.com/lczmx/p/12213776.html
Copyright © 2020-2023  润新知