程序异常的处理

异常

一些常见异常类型

所有异常的父类:BaseException
KeyBoardInterrupt
Exception:NameError,ValuError,AttributeError
SystemExit
GeneratorExit

python中异常也采用对象的方式来处理

1.抛出对象
执行某个方法时,如果发生异常,则该方法生成代表该异常的一个对象,停止当前执行路径并将异常对象提交给解释器;
2.捕获异常
解释器得到该异常后,寻找相应的代码来处理异常。

try…一个except结构

最常见的异常处理结构,有异常则跳过try中异常后的代码,没有异常则不执行except后的代码
try:
被监控可能引发异常的语句块
except BaseException[as e]:
异常处理语句块

print('step0')
try:
    print('step1')
    a = 3/0
    print('step2')

except BaseException as e:
    print('step3')
    print(e)
    print(type(e))
    #print('发生异常,0不能做除数')

print('end!!')

程序测试:环输入数字,如果不是数字则异常处理,直到输入88结束循环

while True:
    try:
        x = int(input('请输入一个数字:'))
        print('输入的数字:',x)
        if x == 88:
            print('退出程序')
            break
    except BaseException as e:
        print(e)
        print('异常,输入的不是一个数字')


print('循环数字输入程序结束!')

try…多个except结构

语法结构:
try:
被监控的可能引发异常的语句
except Exception1:
处理Exception1的语句块
except Exception2:
处理Exception2的语句块

exception 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)
    

try…except…else结构

try中有异常,执行except,try中没有异常则执行else。

try:
    a = input('请输入被除数:')
    b = input('请输入除数:')
    c = float(a)/float(b)
    print(c)
pt BaseException as e:
    print(e)
else:
    print('商是:',c)

## try…except…finally结构

finally后的语句,无论发生异常与否,都会执行

try:
    a = input('请输入被除数:')
    b = input('请输入除数:')
    c = float(a)/float(b)
    print(c)
pt BaseException as e:
    print(e)
else:
    print('商是:',c)
finally:
    print('我是finally中的语句,无论异常是否发生,我都执行!')

print('程序结束')

测试finally

try:
    f = open('c:/a.txt','r')
    content = f.readline()
    print(content)
except:
    print('文件未找到')
finally:
    print('run in fianlly, 关闭资源')

    try:
        f.close()
    except BaseException as e:
        print(e)

print('程序运行结束!')

return语句和异常处理问题

return的作用:1,结束方法运行,返回值
不能放在try…except…else…finally中间

常见异常的解决

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

常见异常汇总

with上下文管理器

更方便实现释放资源操作
with 上下文管理的语法结构:
with context_expr[as var]:
语句块

trackback模块

打印异常信息

import traceback
"""
try:
    print('step1')
    num = 1/0
except:
    traceback.print_exc()
"""
#####异常信息输出到指定文件中######

try:
    print('step1')
    num = 1/0
except:
    with open('d:/a.txt','a') as f:
        traceback.print_exc(file=f)

自定义异常类

自己定义异常类,raise语句抛出异常

class AgeError(Exception): #继承Exception
    def __init__(self,errorInfo):
        Exception.__init__(self)
        self.errorInfo = errorInfo
    def __str__(self):
        return str(self.errorInfo)+'年龄错误!应该在1-150之间'

#########测试代码###########
if __name__ == '__main__': #如果为true,则模块是作为独立的文件运行,可以运行测试代码
    age = int(input('请输入一个年龄:'))
    if age<1 or age>150:
        raise AgeError(age)
    else:
        print('正常年龄:',age)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值