• 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定义的异常,一样用。

      

      

     

  • 相关阅读:
    hi.baidu.com 百度流量统计
    Autofac is designed to track and dispose of resources for you.
    IIS Manager could not load type for module provider 'SharedConfig' that is declared in administration.config
    How to create and manage configuration backups in Internet Information Services 7.0
    定制swagger的UI
    NSwag在asp.net web api中的使用,基于Global.asax
    NSwag Tutorial: Integrate the NSwag toolchain into your ASP.NET Web API project
    JS变量对象详解
    JS执行上下文(执行环境)详细图解
    JS内存空间详细图解
  • 原文地址:https://www.cnblogs.com/masako/p/5846812.html
Copyright © 2020-2023  润新知