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('触发断言')

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

  • 相关阅读:
    streamsets 集成 cratedb 测试
    streamsets k8s 部署试用
    streamsets rest api 转换 graphql
    StreamSets sdc rpc 测试
    StreamSets 相关文章
    StreamSets 多线程 Pipelines
    StreamSets SDC RPC Pipelines说明
    StreamSets 管理 SDC Edge上的pipeline
    StreamSets 部署 Pipelines 到 SDC Edge
    StreamSets 设计Edge pipeline
  • 原文地址:https://www.cnblogs.com/caesar-id/p/12859377.html
Copyright © 2011-2022 走看看