异常

一. 异常机制本质

  1. 在没有异常机制时,需要考虑各种异常情况,导致逻辑代码和错误处理代码放在一起,而且要求程序员考虑很多例外情况。
  2. 异常是指程序运行过程中出现的非正常现象,例如用户输入错误,除数为零,需要处理的文件不存在,数组下标越界等
  3. 异常处理是指程序出现问题时依然可以正确地执行剩余程序,而不会因为异常终止程序
  4. Python中引进了很多描述和处理异常的类,称为异常类,异常类定义中包含该类异常的信息和异常进行处理的方法。
  5. 在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象
  6. 异常采用对象的方法处理:
    a. 抛出异常:执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把一场对象提交给解释器
    b. 捕获异常:解释器得到该异常后,寻找相应的代码处理异常

二. 异常定位

  1. 发生异常时,解释器会报相关的错误信息,并会在控制台打印相关的错误信息,我们只需按照从上到下的顺序即可追溯错误发生的过程,最终定位引起错误的那一行代码

三. 异常处理结构

1. try…一个except结构

print("step 1")
try:
    print("step 1")
    a=3/0
    print("step 2")
except BaseException as e:
    print("step 3")
    print(e)    #e是产生的异常对象,输出e(错误描述)division by zero
    print(type(e))  #<class 'ZeroDivisionError'>

print("end")
#循环输入数字,若不是数字,异常处理,输入88循环结束
while True:
    try:
        x=int(input("请输入一个数字"))
        print("输入的数字:",x)
        if x==88:
            print("退出程序")
            break
    except:          #可以只用except
        print("异常,输入的不是一个数字")
print("程序结束")

#或者写为
while True:
    try:
        x=int(input("请输入一个数字"))
        print("输入的数字:",x)
        if x==88:
            print("退出程序")
            break
    except ValueError as e:
        print(e)
        print("异常,输入的不是一个数字")
print("程序结束")

2. try…多个except结构

  1. 一般建议尽量捕获可能出现的多个异常(按照先子类后父类的顺序),并针对性的写出异常处理代码
  2. 为了避免遗漏可能出现的异常,可以在最后增加BaseException
try:
    a=input("请输入一个被除数")
    b=input("请输入一个除数")
    c=float(a)/float(b)
    print(c)
except ZeroDivisionError:
    print("异常,不能除以0")
except ValueError:
    print("异常")
except NameError:
    print("变量不存在")
except BaseException as e:
    print(e)
    print(type(e))

3. try…except…else结构和 try…except…finally结构

  1. 如果try块中没有抛出异常,则执行else块;如果try块中抛出异常,则执行except块,不执行else块
  2. finally无论是否发生异常都会被执行,通常用来释放try块中申请的资源
try:
    a=input("请输入一个被除数")
    b=input("请输入一个除数")
    c=float(a)/float(b)
except ZeroDivisionError:
    print("异常,不能除以0")
except ValueError:
    print("异常")
except NameError:
    print("变量不存在")
except BaseException as e:
    print(e)
    print(type(e))
else:
    print(c)
finally:
    print("我是finally中的语句,无论是否出错,都执行")
print("end")

4. return语句

  1. 由于return有两种作用,结束方法运行,返回值,一般不把return放到异常处理结构中,而是放到方法中展开

四. 常见异常汇总

  1. SyntaxError:语法错误
  2. NameError:尝试访问一个没有申明的变量
  3. ZeroDivisionError:除数为0
  4. ValueError:数值错误
  5. TypeError:类型错误
  6. AttributeError:访问对象不存在的属性
  7. IndexError:索引越界异常
  8. KeyError:字典关键字不存在

五. 自定义异常类

  1. 自定义异常类一般都是运行时异常,通常继承Exception或其子类即可
  2. 命名一般以Error,Exception为后缀
  3. 自定义异常由raise主动抛出
#自定义异常
class AgeError(Exception):
    def __init__(self,errorInfo):
        Exception.__init__(self)
        self.errorInfo=errorInfo
    def __str__(self):    #重新定义输出
        return str(self.errorInfo)+"年龄错误,应该在1-150之间"

###########测试代码###########
if __name__=="__main__":     #防止导入此模块时运行测试代码
    age=int(input("请输入一个年龄:"))
    if age<1 or age>150:
        raise AgeError(age)    #抛出错误
    else:
        print("正常的年龄",age)

六. traceback模块

#traceback
import traceback

try:
    print("step1")
    num=1/0
except:
    traceback.print_exc()  #打印出错误的trace


#将异常信息写入指定文件
import traceback

try:
    print("step1")
    num=1/0
except:
    with open(r"C:\Users\13880\Desktop\runtest.txt","a") as f:  #a对应在文本末尾添加
        traceback.print_exc(file=f) #指定记录异常文件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值