zoukankan      html  css  js  c++  java
  • python学习笔记(七)、异常

    博客已迁移到CSDN《https://blog.csdn.net/qq_33375499

      在实际开发中,往往不会出现一个系统编写下来,没有出现任何一个bug。为处理这种会出现错误的地方,如除数为零的除法,python提供了非常强大的机制————异常处理机制。

    1 异常

      python使用异常对象来表示程序异常状态,并在遇到错误时引发异常。异常对象未被处理(或捕获)是,程序将终止运行并显示一条异常错误消息(traceback)。

    2 异常相关处理

      2.1 raise语句

      要引发异常,可使用 raise 语句,并将一个类(必须是Exception的子类)或实列作为参数。将类作为一个参数时,将自动创建一个实例。如:

      raise AttributeError      ——> 表示引发了一个异常

      raise AttributeError('引用属性或给它赋值失败!!!')  ——> 表示引发一个异常,并添加了错误消息提示。

      2.2 异常基本处理

      处理异常,首先需要对异常进行捕获,然后才能进行相关的操作。下面是捕获异常时基本语句:

      try:

        raise Exception('发起一个异常')

      except Exception:

        print('程序运行产生了一个异常')

      else:

        print('什么异常也没发生')

      finally:

        print('不管是否发生了异常都会执行该finally语句块')

      try/except:最简单的异常捕获并处理的语句,在该语句中,except可以有多个,也可以将多个异常全部写到一个except语句后面。如:except (OSError,AttributeError,IndexError):pass

      else:else是在程序一次执行try语句块中没有发生任何异常时,代码才会执行else中的语句。

      finally:不管程序是否发生了异常,都会执行该finally语句块。

      注意:在异常处理过程中,try/except语句可以和else、finally搭配使用,也可以不创建else和finally语句。如果要捕获所有异常,可以在except语句后面用Exception或者什么也不写来捕获所有异常。但是一般建议使用Exception。

      2.3 一些常见的异常

      Exception:几乎所有的异常类都是从它派生出来的

      AttributeError:引用属性或给它赋值失败时引发

      OSError:操作系统不能执行指定任务(如打开文件)时引发,有多个子类

      IndexError:使用序列中不存在的索引时引发,为LookupError的子类

      KeyError:使用映射中不存在的键时引发,为LookupError的子类

      NameError:找不到变量名称时引发

      SyntaxError:代码不正确时引发

      TypeError:将内置操作或函数用于类型不正确的对象时引发

      ValueError:将内置操作或函数用于这样的对象时引发:其类型正确但包含的值不合适

      ZeroDivisionError:在除法或求模运算的第二个参数为0时引发

      2.4 异常传播

      在一个函数中,如果异常没被捕获或捕获后又重新引发,将从函数向外传播到调用函数的地方。如果一直没被捕获,异常将向程序的最顶层传播。

      2.5 捕获对象

      在代码编写中,我们通常想知道是那个对象或那个值引发了异常,方便进行程序调试,我们可以在异常捕获语句的except后面加上 as 语句。如:

      try:

        ....

      except (Exception,OSError) as e:

        print(e)

      该断代码将输出发生异常时的对象。

    3 自定义异常

      在实际开发中,往往python中提供的异常满足不了业务需求,辣么怎么办呢? python中可以自定义异常来满足那些特殊的需求,并通过视同raise语句来调用。辣么如何创建自定义异常呢?异常也是一个类,只不过属于一个特殊的类,但是必须直接或间接地继承Exception类。如:

      class MyException(Exception):

        def _init__(self,param):  #__init__为初始化函数

          print(f'{param} 引发了异常!!!')

      x = 1

      raise MyException(x)  ——> 1引发了异常!!!

    4 警告

      如果你只想用于指出了代码超出了你的设想,辣么可以发送一个警告,并且不影响程序的执行。可以使用warnings模块中的函数warn。如:

      warn('这是一个警告,表示代码执行超出了预想!!!')

      如果其他代码在使用你的模块时,可使用warnings模块中的函数filterwarnings来抑制你发出的警告(或特定类型的警告),并指定要采取的措施,如“error”或“ignore(忽略所有)”。

      warnings.filterwarnings(action,category=Warning,...)    ——> 用于过滤警告

      warnings.warn(action, category=None)          ——> 用于发出警告

  • 相关阅读:
    LeetCode对撞指针汇总
    167. Two Sum II
    215. Kth Largest Element in an Array
    2018Action Recognition from Skeleton Data via Analogical Generalization over Qualitative Representations
    题解 Educational Codeforces Round 84 (Rated for Div. 2) (CF1327)
    题解 JZPKIL
    题解 八省联考2018 / 九省联考2018
    题解 六省联考2017
    题解 Codeforces Round #621 (Div. 1 + Div. 2) (CF1307)
    题解Codeforces Round #620 (Div. 2)
  • 原文地址:https://www.cnblogs.com/www-123456/p/10485803.html
Copyright © 2011-2022 走看看