zoukankan      html  css  js  c++  java
  • Python异常基础

    一、常见异常及场景举例

     1.AssertionError

      断言失败,断言是调试中常用(表示自己并不常用┑( ̄Д  ̄)┍)手段

      举例:

      
    def foo(s):
        n = int(s)
        assert n != 0, 'n is zero!'
        return 10 / n
    foo(0)
    View Code

      上面代码就会输出AssertionError: n is zero!

      方案:

      一般是自己写的,检查设置断言(assert)的地方

     2.AttributeError

      访问了对象没有的属性

      举例:

      
    str_a = '123'
    str_a.decode()
    View Code

      上面代码会输出:AttributeError: 'str' object has no attribute 'decode'

      方案:

      检查报错相应行,和对应的对象。一般报错会有提示对象的类型。

     3.IOError

      输入输出异常,常见于文件操作

      举例:

      
    file = 'hello_world.txt'
    f = open(file, 'r')
    f.read()
    f.close()
    View Code

      上面代码会输出:

      python2:IOError: [Errno 2] No such file or directory

      python3:FileNotFoundError: [Errno 2] No such file or directory

      方案:

      检查文件、文件路径、文件操作权限

     4.IndexError

      索引异常,一般是索引超出范围

      举例:

      
    list1 = [1, 2, 3]
    print(list1[3])
    View Code

      上面代码输出IndexError: list index out of range

      方案:

      检查对应位置的对应类型的对象的值。比如是否获取到的列表为空?调试或者打印看看。

        或者获取到的值和自己预想的不一样?是不是格式整齐的许多列表中出了一个叛徒?

      5.ImportError

      模块或者包引入错误

      整个错误很常见,不举例了

      方案:

      检查是否包没有安装?python不同版本的同一功能的模块是否叫法不一样?

      模块名的大小写有没有问题?模块路径对不对?

     6.IndentationError

      代码没有正确对齐

      举例:

      
    list1 = [1, 2, 3]
     print(list1)
    View Code

      方案:

      检查缩进。冒号下一行是不是没缩进?同一代码块缩进格数不一样?是不是用了tab缩进,空格出问题了?

     7.NameError

      对象未声明/初始化,属性不存在

      举例:

      
    print a
    View Code

      方案:

      python不用额外声明变量,检查一下有没有初始化。另外,注意一下作用域。

      在类里面的时候,检查属性是不是在普通方法里面用到的,而没在__init__()中初始化。

     8.SyntaxError

      python语法错误

      不举例了,没意思

      方案:

      检查各种括号、冒号等标点符号,是不是用了中文标点?全角半角有没有问题?

      看下python环境,版本有没有用错,比如python3中使用print。。

       9.TypeError

      类型错误

      举例:

      
    num1 = '1'
    print(num1 + 1)
    View Code

      方案:

      检查类型使用。是不是数字当字符串了?是不是参数传错了?

     10.WindowsError、OSError、SystemError

      系统调用失败、操作系统错误、解释器系统错误

      检查解释器有没有问题,操作系统权限有没有

    二、处理异常语句

      Python处理异常相关语句try、except、else、finally

     1.try:
      捕捉异常,捕捉到异常后转入except处理

      感觉某块代码会有异常时,就捕捉。

       2.except:

      处理异常,对捕捉到的异常进行处理,在try里面出现异常时进入该语句块

      可以跟异常类型,如 except NameError,只处理相应类型的异常,类型不对,则异常继续抛出

      python2中except NameError,e:

      python3中except NameError as e:

      不跟类型时,啥异常都处理

      可以嵌套多个,会从上到下一个一个匹配

      不想处理的时候用pass

     3.else:
      无异常时执行,在try里面没有出现异常时进入该语句块

     4.finally:
      退出try时执行,不管有没有异常退出try时都执行。

      与try配对,一个try只能有一个,一段程序中多个try可以有多个finally。

      当程序异常退出时finally也能执行,因为异常退出时,说明try没有准确捕捉异常,但是try已经试图捕捉过,退出try时仍然会执行finally,然后再把异常向上抛出。

    三、异常处理顺序

      异常从内到外捕捉,一层一层向上抛出。都没抓到就报错。

      如:

      try:

        # 他没捉到我再捉

        try:

          # 我先捉

        except Exception:

          # 有问题在我这处理,不该我背的锅就甩出去

      except:

        # 我处理里面没抓到的问题,处理不了的锅同样甩出去

      else:

        # 没什么问题,就我来说句,

        # 有问题我就静静地看你们甩锅

      finally:

        # 不管怎样我来总结一下

    四、手动引发异常

     1.语句 raise

      raise后面可以跟异常,也可以不跟

      raise执行之后就抛出异常,一般情况下程序终止

      使用try...except...语句捕捉raise抛出的异常,和普通异常一样处理

      

     2.手动引发异常的原因

      1)你喜欢,你就引发个异常

      2)你不让别人这么做,就引发个异常

      3)这个不合理,我引发个异常

      

      看到一句话,觉得很有道理,摘抄:

         所有的异常都是主动抛出的,只是不是你抛出的。

      比如说python的各种异常,就是python主动抛出的,把python看做一个和我们一样的人,只不过是它在制定游戏规则而已。

      主动引发异常因情况而定。很多情况会用在制定规则、测试、终止程序等等。

      

    五、自定义异常

      使用一个类继承Exception即可自定义异常

      Exception是异常类的基类,BaseException是Exception的基类。

      比如说

      
    class MyException(Exception):
        pass
    
    try:
        raise MyException('hello!')
    except MyException as e:
        print(type(e))
        print(e)
    View Code

      自定义的异常,和python定义的异常,一样用。

      

      

     

  • 相关阅读:
    Effective Java 第三版——26. 不要使用原始类型
    Effective Java 第三版——25. 将源文件限制为单个顶级类
    Effective Java 第三版——24. 优先考虑静态成员类
    Effective Java 第三版——23. 优先使用类层次而不是标签类
    Effective Java 第三版——22. 接口仅用来定义类型
    Effective Java 第三版——21. 为后代设计接口
    Effective Java 第三版——20. 接口优于抽象类
    Effective Java 第三版——19. 如果使用继承则设计,并文档说明,否则不该使用
    Effective Java 第三版——18. 组合优于继承
    Effective Java 第三版——17. 最小化可变性
  • 原文地址:https://www.cnblogs.com/masako/p/5846812.html
Copyright © 2011-2022 走看看