异常处理

Posted yangyufeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异常处理相关的知识,希望对你有一定的参考价值。

元类中的__new__方法

  __new__方法用于新建类对象,通过type调用__new__可以用来创建一个空的对象

  __new__与__init__的区别

    作为一个类对象必须具备三个组成部分,所以调用type中的__new__来完成组装
            得到这个类对象需要返回,以供__init__来使用

异常处理

  什么是异常处理?

    什么是异常?  与正常情况不同的就是异常,在程序执行过程中,出现错误导致代码无法执行完毕,就称之为异常

  常见异常

技术分享图片
 1 AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
 2 IOError 输入/输出异常;基本上是无法打开文件
 3 ImportError 无法引入模块或包;基本上是路径问题或名称错误
 4 IndentationError 语法错误(的子类) ;代码没有正确对齐
 5 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
 6 KeyError 试图访问字典里不存在的键
 7 KeyboardInterrupt Ctrl+C被按下
 8 NameError 使用一个还未被赋予对象的变量
 9 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
10 TypeError 传入对象类型与要求的不符合
11 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
12 导致你以为正在访问它
13 ValueError 传入一个调用者不期望的值,即使值的类型是正确的
常见异常

  组成异常的三部分:

    1.追踪信息 2.异常类型 3.异常的值

  如何排查错误:

    1.定位错误发生的位置

       (使用追踪信息
                                1.代码是自己写的,没有调用任何的内置模块与方法,那么错误发生位置一定在最后一行
                                2.如果代码调用内部模块与其他模块的方法:

           1.是系统内置的模块  例如抛出位置object.py 不用去查看object类  它几乎不可能出错一定是你自己代码在调用时出了错误
           2.别人写的模块是有可能出错的 所以 你可以按照追踪信息点击去看看
                      如果有很多追踪信息,找最后一行是自己写的代码的位置

    2.查看异常类型  例如:IndexError
         3.查看异常的值  例如: list index out of range

      如果没有任何异常信息 但是程序就是不对 可以使用排除法

  异常可以根据发生时间分为两类:
          1.语法检测异常 (语法异常和缩进错误)
              解释器在执行代码前会检测语法,检测通过才会执行,如果这个阶段出现异常,代码一行都不会执行
          2.运行是异常
            已经通过语法检测,在解析执行期间发生异常
  异常处理语法:
          语法1:
              try: #可能发生错误的代码
              except 异常类型: #当try 中发生错误时会执行expect中的代码  做一些补救措施
          语法2
              try:
              except 异常类型:
              except 异常类型:
              except 异常类型:
          语法3 #在一个except中可以有多个异常类型,用逗号隔开
              try
              except ():
          语法4: #万能异常 尽量少用 程序即不报错 也不正常运行 无法定位错误位置
                 # 建议输出错误信息
              try:
              except Exception:
          语法5: # +as 使用  通过给异常取别名获取异常的对象,对象中包含了错误信息
             try:
              except Exception as e:
              #e 输出错误信息
              print(e)
          语法6: # 先捕获能够明确的异常类型,最后捕获万能异常
              try:
              except ZeroDivisionError:
              except IndexError:
                  except Exception as e:
          语法7

      try:

      except:

      else
          语法8
          import io
          finally #无论是否发生异常最后都会执行finally 中的代码
          使用场景:

技术分享图片
 1            try:
 2               print(start)
 3               f = open(‘‘,rt,encoding=utf-8)
 4               f.write(123456)
 5               print(end)
 6           except FileNotFoundError:
 7               print(文件路径错误....)
 8           except io.UnsipporatedOperation:
 9               print(文件不能被写入...)
10           finally:
11               f.close()
12           print(f.close)
View Code

  正确使用异常处理的步骤:

技术分享图片
1 """
2 1.如果能明确知道异常发生原因 就不要产生异常  使用if判断等方式
3 2.不知道异常发生的原因 但是知道异常的类型 那就明确捕获该类型的异常
4 3.不知道发生原因 也不知道 异常的类型 可以使用万能异常 但是一定要打印异常消息
5 """
View Code

  为什么要主动抛出异常?

技术分享图片
1 #当写了一些功能,是提供给别人的,然而使用者不按照规则会用,就会导致程序出错,而我们无法帮助用户处理这个错误
2 #需要用raise 主动抛出异常 后面跟任意Exception的子类
View Code

  自定义异常类

技术分享图片
1         class MuException(Exception):
2             pass
View Code

断言: assert

     断定 很确定某个条件是成立的
          有一段代码要执行必须要保证某个条件是成立的
          简化代码,后面必须跟bool表达式
          直抛出异常AssertionError   局限性在于 异常类型固定,而且不能指定异常信息













































以上是关于异常处理的主要内容,如果未能解决你的问题,请参考以下文章

使用片段中的处理程序时出现非法状态异常

Java异常处理机制

java 反射代码片段

java.util.MissingResourceException: Can't find bundle for base name init, locale zh_CN问题的处理(代码片段

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段

片段中的Android致命异常