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)

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

原文地址:https://www.cnblogs.com/chiyun/p/14063591.html