zoukankan      html  css  js  c++  java
  • python异常处理

    关于异常

    在程序运行中,总会遇到各种各样的错误,如打开一个不存在的文件,程序期待用户输入数字,但用户输入了字符串,网络传输终止等,如果不对这些可能引发异常的情况进行处理,就会导致抛出异常程序被终止,这样对用户体验来说是很不友好的,所以为保证程序的健壮性,有必要对一些可能引发异常地方进行异常处理。

    如下我们打开一个不存在的文件:

    异常语法

    基本语法:

    try:
         被检测的代码块
    except 异常类型:
         处理异常

    下面对打开文件异常进行处理

    try:
        f = open('a.test')
    except FileNotFoundError as e:
        print(e)

    处理后效果如下:

    有了上面的异常处理后,程序便不会抛出异常正常执行了,异常处理还可以进行多分支处理,如下:

    import json
    dict_1 = {'a':1,'b':2}
    json_obj = json.dumps(dict_1)
    try:
        print(json_obj.keys()) # 将json字符串当字典使用,引发属性异常
    except ValueError as e:
        print(e)
    except AttributeError as e:
        print(e)
    except TypeError as e:
        print(e)

    上面的示例在except 中指定了FileNotFoundError、ValueError、AttributeError等。这是我们猜测可能会引发这些异常,如果异常不在我们的分支中我们则无法捕获对其进行处理了,上述只是在确定只有这几种异常不会出现其它异常的情况下使用,如果不能保证,我们可以使用万能的Except类,它可以接收所有异常。如下:

    import json
    dict_1 = {'a':1,'b':2}
    json_obj = json.dumps(dict_1)
    try:
        print(json_obj.keys()) # 将json字符串当字典使用,引发属性异常
    except Exception as e:  # 万能异常
        print(e)

    对比多分支和万能异常Exception:

    多分支逻辑结构更加清晰明确,可以根据具体的异常解决对应的问题,但容易出现想的不全面,导致引发其它异常造成程序终止。万能异常Exception虽然可以接收所有异常,但它无法根据具体的异常去解决对应的问题,适用于无论引发什么异常我都执行一个结果,它们各有各的优点,也各有各的不足,多数情况我们可以将它们结合使用,如下:

    import json
    dict_1 = {'a':1,'b':2}
    json_obj = json.dumps(dict_1)
    try:
        print(json_obj.keys()) # 将json字符串当字典使用,引发属性异常
    except ValueError as e:
        print(e)
    except AttributeError as e:
        print(e)
    except TypeError as e:
        print(e)
    except Exception as e:  # 万能异常
        print(e)

    下面来看两个比较有趣的else、finally

    import json
    dict_1 = {'a':1,'b':2}
    json_obj = json.dumps(dict_1)
    try:
        print(json_obj)
    except ValueError as e:
        print(e)
    except AttributeError as e:
        print(e)
    except TypeError as e:
        print(e)
    except Exception as e:
        print(e)
    else:  # 如果没有发生异常,将被执行
        print('如果没有异常,我会被执行')
    finally:  # 无论有没有异常,都会被执行
        print('无论有没有异常,我都会被执行,通常是进行清理工作')

    else:如果try没有捕获到异常,就执行else内的代码块,如果try捕获到了异常,else的代码块就不会被执行。

    finally:无论try捕获到异常还是没捕获到异常都会被执行。

     自定义异常

    class MyException(Exception):
        '''
        自定义异常类
        '''
        def __init__(self,msg):
            self.msg = msg
        def __str__(self):
            return f'MyException:{self.msg}'
    
    num = input('请输入3位纯数字
    >>>')
    
    try:
        # 这里为了演示,所以使用raise主动抛出异常
        if not num.isdecimal():
            raise MyException('请输入纯数字')
        elif len(num) != 3:
            raise MyException('只能输入3位纯数字')
    except MyException as e:
        print(e)
    
    # 打印内容如下
    请输入3位纯数字
    >>>a12
    MyException:请输入纯数字

     raise 可主动抛出异常。

    asset断言:asset后面一般是一个表达式,如果表达式结果为True,不会触发断言,如果结果为False将触发断言AssertionError。

    如下:引发断言

    断言也属于异常,因此也可以使用try进行捕获,如下:

    try:
        assert 1<0
    except:
        print('触发断言')

    这样程序就不会因为断言而终止了,断言一般用于参数检查,如果发现参数有误直接抛出断言终止,避免因为错误的参数导致程序的错误。 

  • 相关阅读:
    FLASH置于底层
    图片等比缩放
    fedora 系统使用 Broadcom BCM4312 无线网卡(转)
    ubuntu语言问题
    轻松安装、卸载Linux软件
    redhat6.0下使用vnc
    http网络安装centos 5.5系统总结
    如何在windows下搭建python的IDE开发环境
    对做技术的一点思考
    C++继承类和基类之间成员函数和虚函数调用机制
  • 原文地址:https://www.cnblogs.com/caesar-id/p/12859377.html
Copyright © 2011-2022 走看看