zoukankan      html  css  js  c++  java
  • Python-异常处理

    一、异常处理

    什么是异常

    异常是错误发生的信号,一旦程序出错就会产生一个异常。如果该异常没有被处理,该异常就会被抛出,程序也会随之终止。(前面的代码会正常运行)

    异常的三个组成部分

    1.具体哪一行代码抛出的异常

    2.异常的种类(如NameError)

    3.异常的内容信息

    如何处理异常

    1.语法错误:Syntax Error,如我们在使用if 时忘记了最后的括号,这种错误只能自己在程序运行前后改正

    2.逻辑错误:逻辑错误有很多的情况,如:NameError,KeyError 等。具体情况要具体分析,因为逻辑错误是无法避免的。

    针对逻辑错误:

    1.如果是可预知的错误,如猜年龄游戏,用户可能输入字母,我们应该用if判断来完善程序,此时异常还没有被抛出,就进入了其他分支的代码中

    age = input('>>: ').strip()
    if age.isdigit():
      age=int(age)
      if age > 18:
          print('too big')
      elif age < 18:
          print('too small')
      else:
          print("got it")
      else:
          print('必须输入数字')
    

    2.如果异常是不可预知的,如我们以后在开发时,在通信数据交互时,服务端断电或者断网,我们无法预知到底是什么情况发生,或者在使用迭代器时,我们并不知道迭代器是否取完了值,我们应该做好异常处理,完善补救措施。在try后面的代码块,是属于全局级别的代码,在except后面的代码块,可以用来放一些补救措施的代码或者打印错误信息到日志中,方便日后排除。

    正常异常处理代码格式如下:

    try:
    		代码
    except 异常类型:
    		发生异常后的代码
    # 可以打印错误的内容
    except 异常类型 as e:
    		print(e)
    except 异常类型:
    		发生异常后的代码
    # 若有针对好几种错误类型要进行统一的处理
    except (异常类型1,异常类型2,异常类型3):
    		发生异常后的代码
    else:
      	未发生异常运行的代码
    finally:  # 一般用来回收资源,防止异常发生后,后续代码无法运行使得系统资源无法回收
    		无论是否发生异常都会运行的代码
    

    常见的逻辑错误种类:(平时要多记)

    NameError:变量名未定义

    IndexError:索引不存在

    KeyError:键不存在

    AttributeError:通过类与对象访问其属性不存在

    ValueError:值错误,如int("ahiva")

    TypeError:类型错误,如'ab'+2

    万能异常

    Exception(与任何类型都能匹配)

    try:
    		x = 1
    except Exception as e:
    		print(e)
    

    主动抛出异常

    raise NameError("变量名未定义")  # 在类中可用于定制规范
    

    我们封装类,会隐藏类的属性,且对外提供接口限制用户的输入,比如我们想要的age属性,应该是整型,但是用户(注意我们的用户也是程序员,因为真的用户根本就不可能来操作你的对象)可能会输入一串字符,当然我们之前用if判断,可以提醒用户,但是这种做法并不强势,如果是有很多的逻辑代码,因为提醒用户之后,代码还在正常运行。等到很久以后,用户需要了age这个属性的时候,才会发现age没有设置,找的时候又很麻烦,而如果使用raise,我们就可以强制用户输入正常的类型,不然程序直接崩溃。

    其实这个方法就与之前我们用abc模块来实现子类必须实现父类方法的效果一样,都是通过强硬的手段达到使用者必须完成某个功能的效果。

    print('==>11')
    raise ExceptionError("遵守规范呀小老弟")
    print('==>222')
    

    自定义异常类型

    可以自己定义异常类型的名字,接受的参数,输出信息的格式等等。

    常常与raise搭配使用

    class Interface(BaseException):
        def __init__(self, msg, x, y, z):
            self.msg = msg
            self.x = x
            self.y = y
            self.z = z
    
        def __str__(self):
            return "<%s:%s:%s:%s>" % (self.msg,self.x,self.y,self.z)
    
    
    raise Interface("接口异常", 11, 22, 33)
    # python的类与C语言的结构体很相似
    

    断言

    assert,断言。一般用在测试程序时,当真正程序上线后应该删除断言。

    我们在开发时候,经常是合作开发,若我们需要完成的功能需要他人写的功能传递数据,但是因为某些原因,本来应该传过来三个参数变成了两个参数。当然我们可以使用if判断,但是可能后续有几千行代码,全部缩进到一个if判断中并不现实。此时就可以使用断言。

    printt(1)
    x = 1
    assert x == 1:  # assert 条件:
    print(x)
    

    如果断言成功,正常运行后续代码,断言失败,抛出异常。

  • 相关阅读:
    SQL Server Audit监控触发器状态
    SQL Server 数据变更时间戳(timestamp)在复制中的运用
    SQL Server 更改跟踪(Chang Tracking)监控表数据
    SQL Server 变更数据捕获(CDC)监控表数据
    SQL Server 事件通知(Event notifications)
    SQL Server 堆表行存储大小(Record Size)
    SQL Server DDL触发器运用
    SQL Server 默认跟踪(Default Trace)
    SQL Server 创建数据库邮件
    SQL Server 跨网段(跨机房)FTP复制
  • 原文地址:https://www.cnblogs.com/chiyun/p/14063591.html
Copyright © 2011-2022 走看看