slf4j打印未捕捉异常_Python 异常分类和处理

       程序出现错误和异常是日常工作非常常见的问题,这些错误可以是语法上的也可以是逻辑上的。良好的异常处理能够让我们快速的定位代码上的问题,一定程度上提高自己的工作效率。

       Python主要是通过使用 try / Except / finally来处理异常的问题。它的基本结构如下:

try:<语句>        #运行别的代码except <名字>:<语句>        #如果在try部份引发了'name'异常except <名字>,<数据>:<语句>        #如果引发了'name'异常,获得附加的数据else:<语句>        #如果没有异常发生

示例1:异常情况

a = 1/0print(a)>>>ZeroDivisionError: division by zero

因为除数不能为0,所以当程序运行时,就报出除数为0的错误

当使用try except来捕捉异常,如下:

try:    a = 1/0    print(a)except:    print('代码出现问题!')>>>代码出现问题!

这个时候程序运行的结果就是你用try和except捕捉的错误

示例2:异常的简单处理

       当可以判断会出错的原因是时,可以将可能出现的原因写下在except里面,如下所示,因为我要求输入的必须是整数,如果不是就报出‘必须输入整数!!!’的错误:

def func():    try:        n1 = int(input('请输入第一个整数:'))        n2 = int(input('请输入第二个整数:'))        print(n1 + n2)    except:        print('必须输入整数!!!')func()>>>请输入第一个整数:4   请输入第二个整数:a   必须输入整数!!!
示例3:多个except捕捉异常

       我把except的异常分为3类,一类是ZeroDivisionError,即'除数不能为0!!!';一类是ValueError,即'必须输入数字!!!';还有一类就是其他我未知的错误,把他统一归纳到Exception里面,以err的方式打印出来,如下:

def func():    try:        n1 = int(input('请输入第一个整数:'))        n2 = int(input('请输入第二个整数:'))        per = input('输入运算符号(+ - * /):')        result = 0        if per == '+':            result = n1 + n2        elif per == '-':            result = n1 - n2        elif per == '*':            result = n1 * n2        elif per == '/':            result = n1 / n2        else:            print('符号输入有误!!!')        print('结果是:', result)    except ZeroDivisionError:        print('除数不能为0!!!')    except ValueError:        print('必须输入数字!!!')    except Exception as err:        print('出错啦,出错的原因为:', err)func()

注意:

(1)多个异常的需要注意,最大的Exception需要放在你最后。

(2)如果使用else则在try代码里不能出现return

示例4:try /except /else 捕捉异常

       将try /except /else 三者连用,如果出现异常,则打印ValueError,如果没有异常则打印'数字输入完毕!'

def func():    try:        n1 = int(input('输入一个数字:'))        print(n1)    except ValueError:        print('输入必须是数字!!')    else:  #没有异常才会进入的代码        print('数字输入完毕!')func()
示例5:try /except /finally 捕捉异常

       将try /except /finally 三者连用,如果出现异常,则将异常以err的形式打印出来,而finally里面的内容,无论最终出没出现异常都会进行打印。

def func():    stream = None    try:        stream = open(r'C:\Users\56331\Desktop\test.txt', encoding='utf-8')        container = stream.read()        print(container)    except Exception as err:        print(err)    finally:   #无论有没有异常都会进入的代码        print('-----finally-----')        if stream:            stream.close()func()
示例6:raise 抛出异常

       raise 异常类型(‘提示信息’),将出现的异常进行抛出,后面的提示信息即为打印的内容。

def register():    phonenumber = input('输入13位手机号码:')    if len(phonenumber) != 13:        raise Exception('手机号位数错误,必须为13位!!')    else:        print('输入的手机号为:',phonenumber)register()>>>Exception: 手机号位数错误,必须为13位!!

 综合使用

def register():    phonenumber = input('输入11位手机号码:')    if len(phonenumber) != 11:        raise Exception('手机号不为11位数!!!')    else:        print('输入的手机号为:', phonenumber)try:    register()except Exception as err:    print(err)    print('注册失败!')else:    print('注册成功!') >>>输入11位手机号码:138123412345    手机号不为11位数!!!    注册失败!

总结如下:

  1. except语句不是必须的,finally语句也不是必须的,但是二者必须要有一个,否则就没有try的意义了。
  2. except语句可以有多个,Python会按except语句的顺序依次匹配你指定的异常,如果异常已经处理就不会再进入后面的except语句。
  3. except语句可以以元组形式同时指定多个异常。
  4. except语句后面如果不指定异常类型,则默认捕获所有异常,你可以通过logging或者sys模块获取当前异常。
  5. 如果要捕获异常后要重复抛出,请使用raise,后面不要带任何参数或信息。
  6. 不建议捕获并抛出同一个异常,请考虑重构你的代码。
  7. 不建议在不清楚逻辑的情况下捕获所有异常,有可能你隐藏了很严重的问题。

异常问题的速查表:

  56134977eb07b5557b8bb0a0edd7c14e.png 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值