• 第20课 异常处理


    知识点汇总:

    异常的定义:

    当解释器遇到错误(无法执行)的代码,就会中断当前代码的执行,抛出一个异常对象。

    1、python是解释型语言,没有报错可以执行---到报错那行代码,之后的代码不执行

    2、使用try---except捕获异常       捕获多种异常:try  ---except  异常1    except  异常2.....except  异常n

          捕获特定异常:try except  as e:

    3、捕获所有异常:有时候我们并不知道会抛出什么异常,这时候可以用捕获所有异常。

      1--try  可能出现异常的代码块    except Exception as e:       等价于 try   except  :-traceback.format_exc()----打印详细信息  ,需要import traceback

      Exception  指明所有异常(父类)

    4、finally语句:不管是否有异常,都会去执行一段代码,finally一定要放在最后。

    5、else语句:没有异常的情况下,要执行的一段代码

      1--else必须跟在所有的except代码块后面

      2--在finally前面

    6、函数调用栈

      1--异常发生:解释器中断当前代码的执行,并抛出一个异常对象,并在函数的调用栈从下到上,层层的寻找捕获处理该异常的代码。如果能找到就执行对应的代码

          如果不能则会一直找到最外层的函数结束本次执行

      2、使用raise向上层抛出异常

    7、自定义异常

      1---继承自Exception     

        class NameTooLongError(Exception)

          pass

        class NameTooLongError(Exception)

          pass

      2、使用raise抛出

        raise NameTooLongError

      3、抛出异常常用在:

        1--当函数里面出现错误,代码无法继续进行执行的时候

        2、告诉上层调用代码,什么样执行产生了错误

        3、由上层调用代码决定如何处理

    示例程序

    1-1   没有定义

    print(name)  #变量name没有定义

    1-2  需要加判断

    while True:
        num = input('input a number:')
        if num != 0 and num.isdigit(): # 加判断条件,除数不能为0,且必须为数字。
            print('10000 / %s = %s' %(num, 10000/int(num)))
        else:
            print('input a error, please try again!')

    2-1 使用try except 捕获异常

    while True:
        num = input('input a number:')
        try:
            print('10000/ %s  = %s' % (num, 10000/int(num))))
        except ZeroDivisionError:
            prinit('please input again!')

    2-2  如下面的例子,使用try except进行了异常处理,如果除数为0时,直接字形except后面的打印语句。这时,因为name没被执行,所以没报错。

    while True:
        num = input('input a number:')
        try:
            print('10000/ %s = %s' % (num, 10000/int(num)))
            name  # 此处虽然name 没有定义,但是不会报错,因为当除数为0时,上面的print语句直接出错,跳到了except之后的语句。name 没执行,所以没报错。
        except ZeroDivisionError:
            print('请重新输入!')

    2-3 捕获多种异常

    while True:
        num = input('input a number:')
        try:
            print('10000/ %s = %s' % (num, 10000/int(num)))
        name
        except ZeroDivisionError:
            print('请重新输入!')
        except NameError:  #多种异常用多个except
            print('变量name没有定义!')

    2-4  捕获特定异常

    while True:
        num = input('input  a number:')
        try:
            print('10000/ %s = %s' % (num,  10000/ int(num)))
            name
        except ZeroDivisionError:
            print('请重新输入:')
        except  NameError  as  e:
            print(e, '有变量未定义!')
    
    
    执行结果:
    
    D:Pythonpython.exe "D:/Programs/HelloWorld2/songqin/python/lesson24 异常/lesson24 知识点.py"
    input a number:1
    10000 / 1 = 10000.0 
    name 'name' is not defined 变量未定义!
    input a number:

    3-1  捕获所有异常

    while True:
        num = input('input a number:')
        try:
            print('10000/ %s = %s' % (num,  10000/int(num)))
            name
        except Exception as e:  # 捕获所有异常
            print(e)
    
    
    
    执行结果:
    D:Pythonpython.exe "D:/Programs/HelloWorld2/songqin/python/lesson24 异常/lesson24 知识点.py"
    input a number:1
    10000 / 1 = 10000.0
    name 'name' is not defined
    input a number:0
    division by zero
    input a number:

    3-2  另外一种写法,需要先导入tracebaclk

    import traceback
    while True:
        num = input('input a number:')
        try:
            print('10000 / %s = %s' % (num, 10000/int(num)))
            name
        except:
            priint(traceback.format_exc())
    
    执行结果
    Traceback (most recent call last):
      File "D:/Programs/HelloWorld2/songqin/python/lesson24 异常/lesson24 知识点.py", line 68, in <module>
        name
    NameError: name 'name' is not defined
    
    input a number:0
    Traceback (most recent call last):
      File "D:/Programs/HelloWorld2/songqin/python/lesson24 异常/lesson24 知识点.py", line 67, in <module>
        print('10000 / %s = %s' % (num, 10000 / int(num)))
    ZeroDivisionError: division by zero

    6-1 向上抛出异常

    def f3():  #等级最低---区
        print('in f3 --begin')
        try:
            b = 4/0
        except ZeroDivisionError:
            print()
            raise    # 向上层抛出异常
        print('in f3 --end')
    
    def f2():  #
        print('in f2 --begin')
        f3()
        print('in f2 --end')
    
    
    def f1():
        print('in f1 --begin')
        f2()
        print('in f1  --end')

    7-1 自定义异常

    class NameTooLongError(Exception): #自定义异常的名字
        pass
    
    class NameTooShortError(Exception):  #自定义异常名字
        pass
    
    
    def inPutName():
        name = input('请输入用户名:')
        if len(name) > 10:
            raise NameTooLongError
        elif len(name) < 6:
            raise NameTooShortError
    
    
    try:
        inPutName()
    
    except NameTooLongError:
        print('你输入的用户名太长!')
    
    except NameTooShortError:
        print('你输入的用户名太短!')
  • 相关阅读:
    C#扩展方法学习
    如何用PS快速做出3D按钮效果的图片
    比较C#中几种常见的复制字节数组方法的效率[转]
    GUID的学习
    委托与事件的区别
    利用Marshal.AllocHGlobal申请非托管内存,unsafe代码
    JAVASE(十三) 异常处理
    JAVASE(十二) Java常用类: 包装类、String类、StringBuffer类、时间日期API、其他类
    JAVASE(十一) 高级类特性: abstract 、模板模式、interface、内部类、枚举、注解
    面试题: SpringBoot 的自启动原理
  • 原文地址:https://www.cnblogs.com/nick1998/p/13220528.html
Copyright © 2020-2023  润新知