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

      

      

     

  • 相关阅读:
    org.eclipse.core.internal.registry.ExtensionsParser的流程分析
    控件设计时的属性页定位办法
    IE的内存泄漏问题
    <<深入剖析ASP.NET组件设计>>的一个辅助类
    midp2.0 图片文件名问题
    解决了XMLTextReader的用法的一个难题,EndElement
    J2ME开发心得
    解决Js内存泄漏问题的代码片断
    asp.net代码中尖括号和百分号的含义
    string.Format和cookie代码
  • 原文地址:https://www.cnblogs.com/masako/p/5846812.html
Copyright © 2020-2023  润新知