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)
    

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

  • 相关阅读:
    BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树
    BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树
    单例模式
    JDBC连接数据库查询信息的步骤(提取成配置文件方式)
    JDBC访问数据库查询信息的步骤(硬编码格式)
    大数据
    accp
    递归
    struts2中Action到底是什么,怎么理解
    转发和重定向的区别(简单解释)
  • 原文地址:https://www.cnblogs.com/chiyun/p/14063591.html
Copyright © 2011-2022 走看看