zoukankan      html  css  js  c++  java
  • 【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);
  • 相关阅读:
    [HNOI2002]营业额统计
    HDU 1374
    HDU 3345
    HDU 2089
    Graham扫描法
    Codeforces 1144D Deduction Queries 并查集
    Codeforces 916E Jamie and Tree 线段树
    Codeforces 1167F Scalar Queries 树状数组
    Codeforces 1167E Range Deleting
    Codeforces 749E Inversions After Shuffle 树状数组 + 数学期望
  • 原文地址:https://www.cnblogs.com/klbc/p/9494770.html
Copyright © 2011-2022 走看看