• 【python学习-6】异常处理


    最近在网上看到了一种学习方法名叫费曼学习法,说的是学习一个东西的时候,要尝试着给别人讲出来,就是一种备课式的学习。

    第一步,选择一个你想要理解的概念, 然后拿出一张白纸, 把这个概念写在白纸的最上边。
    第二步,设想一种场景,你正要向别人传授这个概念在白纸上写下你对这个概念的解释, 就好像你正在教导一位新接触这个概念的学生一样。当你这样做的时候, 你会更清楚地意识到关于这个概念你理解了多少, 以及是否还存在理解不清的地方。
    第三步,如果你感觉卡壳了, 就回顾一下学习资料,无论何时你感觉不清楚了, 都要回到原始的学习资料并重新学习让你感到不清楚的那部分,直到你领会得足够顺畅, 顺畅到可以在纸上解释这个部分为止。
    第四步,为了让你的讲解通俗易懂,简化语言表达最终的目的, 是用你自己的语言, 而不是学习资料、课程中的语言来解释概念。如果你的解释很冗长或者令人迷惑, 那就说明你对概念的理解可能并没有你自己想象得那么顺畅,你要努力简化语言表达, 或者与已有的知识建立一种类比关系, 以便更好地理解它。

    我觉得费曼学习法很不错,可以运用到日常的学习中。从这个意义上来说,写博客就显得是一件很明智的事情了,因为你就是把你所理解的东西再讲出来。

    闲话就到这里,开始今天的学习吧。

    1、异常的处理:

      python的异常处理和 java 相似性很高,下面是常有的异常处理代码格式:

    try:
        <语句>
    except <异常1>:
        <语句>
    except <异常2>:
        <语句>
    else:
        <语句>
    try:
        <语句>
    finally:
        <语句>

      对于catch语句,有多种写法:

    except:                                      #捕获所有异常
    except <异常名>:                             #捕获单个异常
    except (异常名1,异常名2):                     #捕获多个异常
    except <异常名> as <数据>:                    #捕获指定异常及附加信息
    except (异常名1,异常名2) as <数据>:            #捕获多个异常及附加信息

      代码示例如下: 

    #!/usr/bin/python
    l = [1,2,3,4,5]; print('---start---'); try: print(l[6]); except: # except 为 try的代码 发生异常时执行。except 是一个总类,所有异常都可以捕获 print('error'); else: # else 为 try的代码 没有引发异常时执行 print('no error'); finally: # finally 为不管 try的代码 是否异常都执行 print('finally code'); print('---end---'); # 其他语句
    #!/usr/bin/python
    l = [1,2,3,4,5];
    print('---start---');
    try: 
        print(l[6]);
    finally: # finally 为不管 try的代码 是否异常都执行
        print('finally code'); # 发生异常,但是此语句是执行了的
    print('---end---'); # 其他语句,没有执行
    #!/usr/bin/python
    # 不同类型的异常区分处理
    l = [1,2,3,4,5];
    print('---start---');
    try: 
        print(l[6]);
    except ZeroDivisionError: 
        print('ZeroDivisionError');
    except IndexError as data:
        print('IndexError:');
        print(data); # 打印异常信息
    else: # else 为 try的代码 没有引发异常时执行
        print('no error');
    finally: # finally 为不管 try的代码 是否异常都执行
        print('finally code');
    print('---end---'); # 其他语句

      上面的第二个代码,看到了两个异常 ZeroDivisionError 和 IndexError ,那么常见的异常有哪些呢?

    AttributeError            调用不存在的方法引发的异常
    EOFError                遇到文件末尾引发的异常
    ImportError                导入模板出错引起的异常
    IndexError                列表越界异常
    IOError                 I/O操作引起的异常
    KeyError                使用字典中不存在的变量名应发的异常
    NameError                使用不存在的变量名引发的异常
    TabError                语句缩进不正确异常
    ValueError                搜索列表中不存在的值引发异常
    ZeroDivisionError        除数为0引发的异常

      在python中,如果多种异常的处理是一样的,那么可以把两个异常写在一块儿:

    #!/usr/bin/python
    # 不同类型的异常区分处理
    l = [1,2,3,4,5];
    print('---start---');
    try: 
        print(l[6]);
    except ZeroDivisionError: 
        print('ZeroDivisionError');
    except (IndexError,TabError): # 两个异常同样的处理
        print('IndexError or TabError');
    else: # else 为 try的代码 没有引发异常时执行
        print('no error');
    finally: # finally 为不管 try的代码 是否异常都执行
        print('finally code');
    print('---end---'); # 其他语句

    2、用代码抛出异常

      上面所说的是Python内置异常,在脚本中,还可以使用 raise 语句手动引发异常。在类中也可以使用 raise 引发异常,并向异常传递数据。

    raise 异常名
    raise 异常名,附加数据
    raise 类名

      简单使用一下raise:

    #!/usr/bin/python
    print('---start---');
    try: 
        raise Exception
    except Exception: 
        print('Exception');
    else: 
        print('no error');
    print('---end---'); # 其他语句

      实际应用中应该是这样的:

    #!/usr/bin/python
    def add(x,y):    
        if x == 0 or y == 0:
            raise ZeroDivisionError('x or y is 0');
        return x+y;
    
    try:
        print('run 1');
        a = add(1,2);
        print(a);
        print('run 2');
        b = add(1,0);
        print(b);  # 这里没有打印,因为上一行异常了
    except ZeroDivisionError as data:
        print(data);

      assert语句的使用:assert语句同样可以引发异常,但与raise不同,assert语句在条件测试为假时,才引发异常。

    assert <条件测试>,<异常附加信息>

      assert的例子:

    #!/usr/bin/python
    import
    traceback def add(x,y): assert x != 0 and y != 0 , 'x or y is 0'; return x+y; try: print('run 1'); a = add(1,2); print(a); print('run 2'); b = add(1,0); print(b); except: # traceback.print_exc() # 使用python中的traceback模块,跟踪错误 f=open("D:/tmp/pyError.log",'a+') traceback.print_exc(file=f) # 将报错输入到文件中 f.flush()

      assert 相当于 raise 语句 和 if 语句联合使用,但是assert语句一般用于开发自测。只有__debug__为true是,assert 才有效。

    3、自定义异常类

      python中可以通过继承Exception类来创建自己的异常类:  

    #!/usr/bin/python
    
    class MyError(Exception):
        def __init__(self,data):
            self.data = data;
        def __str__(self):
            return "MyError:"+self.data;
    
    try:
        raise MyError('0.0');
    except Exception as e:
        print(e);
  • 相关阅读:
    Python+Selenium三种等待方法
    Jmeter结果分析_聚合报告
    Linux安装Python3
    翻译Go Blog: 常量
    Go: 复合数据类型slice
    Python创建二维列表的正确姿势
    了解Flask
    urllib3中学到的LRU算法
    了解Prometheus
    《redis 5设计与源码分析》:第二章 简单动态字符串
  • 原文地址:https://www.cnblogs.com/klbc/p/9494770.html
Copyright © 2020-2023  润新知