python之异常处理

异常处理:通过捕获异常的方式获取这个异常的名称,再通过其他的逻辑代码让程序继续运行,这种根据异常做出的逻辑处理就叫做异常处理。
分类:
1.语法错误(不属于异常处理范畴)
2.运行时错误(Exception异常)
编程中常见的异常:
1.AttributeError:当试图访问的对象属性不存在时抛出的异常
2.IndexError:索引超出序列范围时引发此异常
3.KeyError:字典中查找一个不存在的关键字时引发此异常
4.NameError:尝试访问一个未声明的变量时引发此异常
5.TypeError:不同类型数据之间的无效操作
用if作为错误处理机智的问题:
1.无法穷举所有的异常情况
2.错误处理代码和业务实现代码之间互相混杂,严重影响程序的可读性,增加程序维护的难度。
异常处理的基本语法1:except块--except块后面不跟特定的块则会捕获所有的异常,并且获取异常按照except块顺序执行
try:#引发异常
    可能产生异常的代码块
except[(Exception1,Exception2,....)[as e]]:
    处理异常的代码块1
except[Exception3[as e]]:#捕获异常
    处理异常的代码块2
except:
    处理异常的代码块3
例子1:
try:
    a=input(input('请输入被除数'))
    b=input(input('请输入除数'))
    c=a/b
    print('您输入的两个数相除的结果是:',c)
except ValueError:
    print('程序发生了数字格式异常')
except ArithmeticError:
    print('程序发生了算术异常')
except:
    print('程序遇到了未知异常')
print('程序正常运行!')

异常处理的基本语法2:else块--当try块没有发现异常时,程序则执行else块的代码;当try块发现异常时,程序则不会执行else块的代码
try:#引发异常
    可能产生异常的代码块
except[(Exception1,Exception2,....)[as e]]:
    处理异常的代码块1
except[Exception3[as e]]:#捕获异常
    处理异常的代码块2
except:
    处理异常的代码块3
else:#大部分语法中是将else块的代码放在try块处,当try和else块没有出现错误则是一样的效果,如果出现异常的话在try块就会捕获异常,在else块不会捕获异常直接抛出异常
    程序未发生异常时执行的代码

#例子2:
try:
    a=input(input('请输入被除数'))
    b=input(input('请输入除数'))
    c=a/b
    print('您输入的两个数相除的结果是:',c)
except ValueError:
    print('程序发生了数字格式异常')
except ArithmeticError:
    print('程序发生了算术异常')
except:
    print('程序遇到了未知异常')
else:
    print('没有出现异常')

print('程序正常运行!')
#例子3:
def else_test():
    S=input('请输入除数')
    result=20/int(s)
    print('运算结果为:',result)
def right_main():
    try:
         print('try块运行,没有出现异常')
    except:
        print('程序出现异常')
    else:
        else_test()
def wrong_main():
    try:
         print('try块运行,没有出现异常')
         else_test()
    except:
        print('程序出现异常')
right_main()
wrong_main()
异常处理的基本语法3:finally--无论是否出现异常均会执行finally块
try:#引发异常
    可能产生异常的代码块
except[(Exception1,Exception2,....)[as e]]:
    处理异常的代码块1
except:
    处理异常的代码块2
else:#大部分语法中是将else块的代码放在try块处,当try和else块没有出现错误则是一样的效果,如果出现异常的话在try块就会捕获异常,在else块不会捕获异常直接抛出异常
    程序未发生异常时执行的代码
finally:
    资源回收块
异常处理执行流程:

在python中异常处理㞏结构中有如下的原则:
1.只有try块是必须的,如果没有try块,则不能有后面的except块和finally块;
2.except块和finally块都是可选的,但except和finally块至少出现其中之一,也可以同时出现;
3.可以有多个except,但是在捕获父类异常的except块应该位于捕获子类异常的except块后面;
4.不能只有try块,既没有except块也没有finally块;
5.多个except块必须位于try块之后,finally块只要出现就必须位于所有块最后;
列子4:
def demo():
    try:
         print('try块中')
         return 1
    except:
        print('except块中')
        return 2
    finally:
        print('finally块中')
        return 3
print(demo())

异常处理的基本语法4:raise块在except中使用,则会直接抛出不会处理异常;如果raise块在try中则会捕获异常
raise语句自定引发异常:
语法:raise[Exception)[(reason)]]
raise语句三种常用的用法:
1.raise:单独一个raise,该语句引发当前上下文中捕获的异常(比如在except块中),或默认引发RuntimeError异常。
2.raise异常类名称:raise后带一个异常类名称,该语句引发指定异常类的默认实例。
3.raise异常类名称(描述信息):在引发指定异常的同时,附带异常的描述信息。
列子1:处理用户引发异常的两种方式
def main():
    try:
        mtd(3)
    except Exception as e:
        print('程序出现异常',e)

    mtd(3)

def mtd(a):
    if a>0:
        rasie ValueError('a的值大于0,不符合要求')

if __name__='__main__':
    try:
        main()
    except:
        pass
列子2:不带参数的raise用法
def demo():
    try:
       a=1/0
    except ZeroDivisionError as e:
        print('程序出现异常',e)
        raise

demo()

python中指定自定义的异常AuctionException
class AuctionException(Exception):
    pass
class Auction:
    def __init__(self):
        self.price=100
    def auction(self,price):
        if price< self.price:
            raise AuctionException('竞价出价不能低于起拍价格')
        else:
            self.price=price
auction=Auction()
try:
    auction.auction(80)
    print('当前竞价价格为:',auction.price)
except Exception as e:
    print(e)

一个成功的异常处理程序应该实现的目标:
1.使程序代码混乱最小化
2.捕获并且保留异常信息
3.通知合适的人员
4.采用核实的方式结束异常活动
如何才能达到这些目标:
1.不要过度地使用异常,比较常见的使用异常来代替流程控制。
#列子1:度地使用异常
alist=['hello','mili','python']
try:
    i=0
    while Ture:
        print(alist[i])
        i +=1
except:
    pass
#列子2:流程控制代码的执行
i=0
while i <len(alist):
    print(alist[i])
        i +=1
2.不要使用过度庞大的try块
3.不要忽略捕获到的异常

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值