在我们日常的编程过程中,经常会出现报错的情况,那鲜红的颜色让很多的程序猿心慌慌,写码一小时,找错一整天,所以今天我们就来细致的讲解一下程序运行中的异常报错,让我们不在恐惧那小小的程序报错(Error),首先我们得知己知彼,才能百战不殆!!😃😃😃
什么是异常:
当程序在运行中出现的错误,或逻辑语法出现问题,解释器此时无法继续正常执行,反而出现了一些错误提示,这就是异常(错误或者bug),程序运行过程中出现了异常,轻则无法实现功能或功能出错,重则整个程序崩溃
以下面的报错为例:
NameError: name 'a' is not defined
异常信息 ":"之前的是异常类 之后是异常信息
常见的异常类:
知道了什么是异常,我们就可以采用异常捕获的方式来进行解决:
异常捕获:
捕获异常是在编程中常用的一种处理代码可能出现漏洞的一些基础解决方案
捕获异常的做法 使用 try-expect 语法
try:
# 将自己觉得可能出现异常的模块代码全部放到try里面
print("输出程序")
# 并没有定义a变量,所以直接进行输出的话就会报错
# NameError: name 'a' is not defined
print(a)
except:
# 如果上面的try出现了异常那么程序不会进行报错,而是进入except里面执行程序
print("出现错误")
但是这种方法只会知道代码出现了问题,却不知道具体出现的问题或具体哪里出现的问题
在捕获多个异常的时候,可以在except后用元组的方式写入多种异常类,也可以采用多个except
try:
print(a)
print(1+"2")
except (TypeError,NameError):
print("出现异常!")
但是这里的异常类要包括可能出现的所有异常类,如果有"漏网之鱼"则程序还是会报错出现异常
这里我们得知道所有异常类都是一个类,都有一个Exception父类,因此,我们可以
try:
print(a)
print(1+"2")
except Exception as result: # as+变量名 输出变量名会输出异常的具体信息
print(result)
当我们发现了在try中的代码并没有异常时,我们可以用else来输出我们想要的操作代码
else 表示的是如果代码没有异常应该输出的结果
finnally表示最终结果,不论代码是否捕获到异常(不管是进入了except还是else)都会执行finnally中的代码
try:
print(a)
except Exception as result:
print(result)
else:
print("代码无异常!")
finally:
print("程序运行完毕")
异常的传递:
俗话说的好,实践是检验真理的唯一标准,我们学程序也不能光是纸上谈兵,所以我们将结合下面的这个案例对异常的传递进行讲解:
案例:
对象的必备属性:姓名、年龄、性别、身高、体重
在注册过程中需要检测:姓名2-4位字符
入有误要求抛出异常并重新填写
# 创建一个类并添加姓名、年龄、性别、身高、体重属性
class Register(object):
def __init__(self, name, age, sex, height, weight):
self.name = name
self.age = age
self.sex = sex
self.height = height
self.weight = weight
self.add()
def add(self):
dict = {"姓名": self.name, "年龄": self.age, "性别": self.sex, "身高": self.height, "体重": self.weight}
class NnameinputError(Exception): # 创建一个自定义的异常类
def __init__(self,name):
self.name=name
def __str__(self):
return f"你输入的姓名为:{self.name},不符合条件,输入的姓名长度应为2-4位字符!"
def main(): # 创建程序主入口
while True: # 创建循环,使我们每次输入错误的时候都可以再次重新输入
try:
name=input("请输入姓名:")
if 2>len(name) or len(name)>4: # 自定义异常
raise NnameinputError(name) # raise 关键字用于引发NnameinputError异常
except Exception as nameerror:
print(nameerror)
else:
global new_name # 利用global函数是name的值可以影响到全局
new_name=name
break # 利用break跳出while循环
异常有时可能会成为令人头疼的报错,但如果我们能够将其理解透彻,理解其中的门门道道,我们就可以将异常加之利用,称为程序猿手中的趁手武器!!