zoukankan      html  css  js  c++  java
  • Task 3: 异常处理(2天)

    异常处理

    目录

    1.python 标准异常总结

    2.python 标准警告总结

    3.try_excpt 语句

    4.try_except_finally 语句

    5.try_except_else 语句

    6.raise 语句

    正文

    本次学习任务真的太好了,很久之前就想整理一下各种报错到底是什么东西引起的

    以后可以直接查看字典了


    1.python 标准异常总结

     1 BaseException:所有异常的 基类
     2 Exception:常规异常的 基类
     3 StandardError:所有的内建标准异常的基类
     4 ArithmeticError:所有数值计算异常的基类
     5 FloatingPointError:浮点计算异常
     6 OverflowError:数值运算超出最大限制
     7 ZeroDivisionError:除数为零
     8 AssertionError:断言语句(assert)失败
     9 AttributeError:尝试访问未知的对象属性
    10 EOFError:没有内建输入,到达EOF标记
    11 EnvironmentError:操作系统异常的基类
    12 IOError:输入/输出操作失败
    13 OSError:操作系统产生的异常(例如打开一个不存在的文件14 WindowsError:系统调用失败
    15 ImportError:导入模块失败的时候
    16 KeyboardInterrupt:用户中断执行
    17 LookupError:无效数据查询的基类
    18 IndexError:索引超出序列的范围
    19 KeyError:字典中查找一个不存在的关键字
    20 MemoryError:内存溢出(可通过删除对象释放内存)
    21 NameError:尝试访问一个不存在的变量
    22 UnboundLocalError:访问未初始化的本地变量
    23 ReferenceError:弱引用试图访问已经垃圾回收了的对象
    24 RuntimeError:一般的运行时异常
    25 NotImplementedError:尚未实现的方法
    26 SyntaxError:语法错误导致的异常
    27 IndentationError:缩进错误导致的异常
    28 TabError:Tab和空格混用
    29 SystemError:一般的解释器系统异常
    30 TypeError:不同类型间的无效操作
    31 ValueError:传入无效的参数
    32 UnicodeError:Unicode相关的异常
    33 UnicodeDecodeError:Unicode解码时的异常
    34 UnicodeEncodeError:Unicode编码错误导致的异常
    35 UnicodeTranslateError:Unicode转换错误导致的异常

    标黄色的是经常会遇到的报错类型

    #这个是由于函数名或者方法或或者属性重名了
    list=['a','b']
    list('abcd')
    
    #TypeError: 'list' object is not callable

    2.python 标准警告总结

     1 Warning:警告的基类
     2 DeprecationWarning:关于被弃用的特征的警告
     3 FutureWarning:关于构造将来语义会有改变的警告
     4 UserWarning:用户代码生成的警告
     5 PendingDeprecationWarning:关于特性将会被废弃的警告
     6 RuntimeWarning:可疑的运行时行为(runtime behavior)的警告
     7 SyntaxWarning:可疑语法的警告
     8 ImportWarning:用于在导入模块过程中触发的警告
     9 UnicodeWarning:与Unicode相关的警告
    10 BytesWarning:与字节或字节码相关的警告
    11 ResourceWarning:与资源使用相关的警告

    3.try-except 语句

    #格式如下,[]表示该参数可以输入,或者不输入
    try:
        检测范围
    except Exception[as reason]:
        出现异常后的处理代码

    try 语句按照如下方式工作:

    1 首先,执行try子句(在关键字try和关键字except之间的语句)
    2 如果没有异常发生,忽略except子句,try子句执行后结束。
    3 如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和except之后的报错类型的名称(Exception)相符,那么对应的except子句将被执行。最后执行try语句之后的代码。
    4 如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中
    #FileNotFoundError: [Errno 2] No such file or directory: 'test1.txt'
    f = open('test1.txt') 
    
    
    #可以起as 别名,也可以不起
    try:
        f = open('test1.txt')
        print(f.read())
        f.close()
    except OSError as error:
        print('打开文件出错
    原因是:' + str(error))
    #输出:
    打开文件出错
    原因是:[Errno 2] No such file or directory: 'test1.txt'
    
    
    #FileNotFoundError 替换 OSError
    try:
        f = open('test1.txt')
        print(f.read())
        f.close()
    except FileNotFoundError as error:
        print('打开文件出错
    原因是:' + str(error))
    #输出:
    打开文件出错
    原因是:[Errno 2] No such file or directory: 'test1.txt'
    
    
    
    #TypeError 替换OSError,如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中
    try:
        f = open('test1.txt')
        print(f.read())
        f.close()
    except TypeError as error:
        print('打开文件出错
    原因是:' + str(error))
    #输出:FileNotFoundError: [Errno 2] No such file or directory: 'test1.txt'

    一个try语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行

    #直接执行try里面的代码
    int("abc")  #ValueError: invalid literal for int() with base 10: 'abc'
    s = 1 + '1'  #TypeError: unsupported operand type(s) for +: 'int' and 'str'
    f = open('test1.txt')  #FileNotFoundError: [Errno 2] No such file or directory: 'test1.txt'
    
        
    #一个try语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行      
    try:
        int("abc")   
        s = 1 + '1'
        f = open('test1.txt')
        print(f.read())
        f.close()
    except OSError as error:
        print('打开文件出错
    原因是:' + str(error))
    except TypeError as error:
        print('类型出错
    原因是:' + str(error))
    except ValueError as error:
        print('数值出错
    原因是:' + str(error))    
        
    #输出:
    #数值出错
    #原因是:invalid literal for int() with base 10: 'abc'

    同一语句可以犯了了好几种异常,使用多个except代码块时,必须坚持对其规范排序,要从最具针对性的异常到最通用的异常

    #try-except-else语句尝试查询不在dict中的键值对,从而引发了异常。这一异常准确地说应属于KeyError,但由于KeyError是LookupError的子类,
    且将LookupError置于KeyError之前,因此程序优先执行该except代码块。所以,使用多个except代码块时,必须坚持对其规范排序,要从最具针对性的异常到最通用的异常
    #单独执行 dict1 = {'a': 1, 'b': 2, 'v': 22} x = dict1['y'] #KeyError: 'y' dict1 = {'a': 1, 'b': 2, 'v': 22} try: x = dict1['y'] except LookupError: print('查询错误') except KeyError: print('键错误') else: print(x) # 查询错误

    一个 except 子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组

     1 s = 1 + '1'  #TypeError: unsupported operand type(s) for +: 'int' and 'str' 
     2 
     3 # 一个 except 子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组  
     4 #也是只输出第一个报错原因    
     5 try:
     6     s = 1 + '1'
     7     int("abc")
     8     f = open('test.txt')
     9     print(f.read())
    10     f.close()
    11 except (OSError, TypeError, ValueError) as error:
    12     print('出错了!
    原因是:' + str(error))
    13 
    14 #输出
    15 '''
    16 出错了!
    17 原因是:unsupported operand type(s) for +: 'int' and 'str'    
    18 '''   

    4.try-except-finally 语句

    #格式如下:
    try:
        检测范围
    except Exception[as reason]:
        出现异常后的处理代码
    finally:
        无论如何都会被执行的代码

    不管try子句里面有没有发生异常,finally子句都会执行

    如果一个异常在try子句里被抛出,而又没有任何的except把它截住,那么这个异常会在finally子句执行后被抛出

    #不管有没有try或者except有没有执行,finally后面的语句都会执行
    def divide(x, y):
        try:
            result = x / y
            print("result is", result)
        except ZeroDivisionError:
            print("division by zero!")
        finally:
            print("executing finally clause")
    
    
    divide(2, 1)
    # result is 2.0
    # executing finally clause
    divide(2, 0)
    # division by zero!
    # executing finally clause
    divide("2", "1")
    # executing finally clause
    # TypeError: unsupported operand type(s) for /: 'str' and 'str'

    5.try_except_else 语句

    如果在try子句执行时没有发生异常,Python将执行else语句后的语句

    #使用except而不带任何异常类型,这不是一个很好的方式,我们不能通过该程序识别出具体的异常信息,因为它捕获所有的异常
    try:
        检测范围
    except:
        出现异常后的处理代码
    else:
        如果没有异常执行这块代码

    因此我们使用下面这种方式

    try:
        检测范围
    except(Exception1[, Exception2[,...ExceptionN]]]):
       发生以上多个异常中的一个,执行这块代码
    else:
        如果没有异常执行这块代码
    #如果try子句执行没有发生异常,则将执行else内的语句,否则不执行    
    def divide(x, y):
        try:
            result = x / y
            print("result is", result)
        except ZeroDivisionError:
            print("division by zero!")
        else:
            print("计算成功")    
            
    divide(2, 1)
    divide(2, 0)

    6.raise 语句

    学习任务给出的例子看的不是很明白,我就找了其他的例子

    当程序出现错误,python会自动引发异常,也可以通过raise显示地引发异常。一旦执行了raise语句,raise后面的语句将不能执行

    raise [Exception [, args [, traceback]]]

    语句中 Exception 是异常的类型(例如,NameError)参数标准异常中任一种,args 是自已提供的异常参数。
    最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象

    #抛出一个指定的异常    
    def division():
        num1=int(input('请输入被除数:'))
        num2=int(input('请输入除数:'))
        if num2==0:
            raise ValueError('除数不能为0')
        result=num1//num2
        print(result)
    if __name__=='__main__':
        try:
            division()
        except ZeroDivisionError:
            print('输入错误,除数不能为0')
        except ValueError as e:   # 处理ValueError异常
            print('输入错误',e)    #输出错误原因
        finally:
            print('释放资源并关闭')   

    练习题

    1、猜数字游戏

    题目描述:

    1 电脑产生一个零到100之间的随机数字,然后让用户来猜,如果用户猜的数字比这个数字大,提示太大,否则提示太小,当用户正好猜中电脑会提示,"恭喜你猜到了这个数是......"。在用户每次猜测之前程序会输出用户是第几次猜测,如果用户输入的根本不是一个数字,程序会告诉用户"输入无效"2 (尝试使用try catch异常处理结构对输入情况进行处理)
    3 获取随机数采用random模块

     如果输入了非数字,就终止程序

    import numpy as np 
    import pandas as pd 
    a=np.random.randint(0,100) 
    n=0
    try:
        while 1:
            b=int(input('第{}次输入:'.format(n+1)))
            n=n+1 
            
            if a==b:
                print('恭喜你猜到了,这个数是:',b)
                break
            elif b>a:
                print('数字猜大了')
            else:
                 print('数字猜小了')
            
    
    except ValueError as error:
        print('输入无效')
        n=n+1    
    
    finally:
        print(n)

     如果输入了非数字,还是继续输入

    import random
    secert = random.randint(1, 100) # 计算机生成一个随机数  
    n=1        
    while 1:
        num = input("第{}次输入: ".format(n))
        n=n+1
        if num.isdigit():
            tmp = int(num)
            if tmp == secert:
                print('恭喜你猜到了,这个数是:',num)
                break
            elif tmp < secert:
                print("数字猜小了")
                
            else:
                print("数字猜大了")
                
        else:
            print("输入无效")

    官方答案是下面的:

    import random
    guess=random.randint(1,101)
    i=1
    while True:
        print ("第%d次猜,请输入一个整数数字:"%(i))
        try:
            temp=int(input())
            i+=1
        except ValueError :
            print ("输入无效")
            continue
        if temp==guess:
            print ("恭喜你猜对了,就是这个数",guess)
            break;
        elif (temp>guess):
            print ("大了")
        elif (temp<guess):
            print ("小了")
  • 相关阅读:
    linux 常用操作指令(随时更新)
    Spring @Scheduled应用解析
    H5的FormData对象完成ajax上传文件multiFile
    微服务的4个设计原则和19个解决方案
    微服务实战(六):如何做好服务拆分?
    微服务实战(五):微服务化之缓存的设计
    微服务实战(四):微服务化之无状态化与容器化
    微服务实战(三):以MySQL为例,从原理上理解那些所谓的数据库军规
    微服务实战(二):微服务的接入层设计与动静资源隔离
    微服务实战(一):微服务化的基石——持续集成
  • 原文地址:https://www.cnblogs.com/cgmcoding/p/13372268.html
Copyright © 2011-2022 走看看