Python---异常


一、异常的相关概念

异常: 程序在运行时,如果Python 解释器遇到一个错误,会停止程序的执行,并且提示一些错误信息,这就是异常
抛出异常: 程序停止执行并且提示错误信息这个动作,我们通常称之为:抛出(raise)异常

一、异常捕获关键字

关键字用处备注
try/except异常捕获和处理关键字必须存在
pass异常绕过关键字非必须存在
as X实例化返回的异常类为X非必须存在
else未发生异常时,则执行该代码块非必须存在
finally无论是否发生异常,最后都必须执行的代码块非必须存在
raise抛出异常,相当于函数中的return非必须存在

从上表中可以看出,一般情况下的异常,只需要含有try/except关键字即可,剩下的主要是根据自己的需求适当添加

三、异常捕获完整格式

try:
    #可能存在异常的代码
    pass
except 错误类型1:
    #针对错误类型1,对应的代码处理
    pass
except 错误类型2:
    #针对错误类型2,对应的代码处理
    pass
except(错误类型3,错误类型4):
    #针对错误类型3和4,对应的代码处理
    pass
except Exception as result:  # 实例化异常类,用于调用异常相关信息
    #打印错误信息
    print(result)
else:
    #没有异常执行的代码
    pass
finally:
    #无论是否有异常,都会执行的代码
    print('无论是否有异常,都会执行的代码')

举例:

try:
    print(num)
except Exception as result:
    print(result)
    pass
else:
    print("未发生异常")
finally:
    print("最终需要执行的代码")

结果演示:
在这里插入图片描述

四、as result解释

  • 异常在Python中也是对象,可以对它进行操作,BaseExcepton是所有异常的基类,其中我们常用的Exception也是继承了BaseException.

先举一个简单的例子:如果只想知道代码块发生错误了,可以像下面这样写:

try:
    print(2/0)
except:
    print("发生错误了")    # 输出为: 发生错误了

如果我们想要知道具体发生了什么错误,我们可以用Exception接收异常信息:

try:
    print(2/0)
except Exception:
    print(Exception)
    print("发生错误了")

运行结果:
在这里插入图片描述

这里可以看出,用Exception接收的是class Exception类,想要具体的调用它,我们就引入了as result,定义一个异常实例result,这样就可以具体的查看异常的信息,如下:

try:
    print(2/0)
except Exception as result:   # 定义一个异常实例result
    print(result)
    print("发生错误了")

运行结果:
在这里插入图片描述

这里的except Exception是可以捕获所有的异常

五、相关实例

举例1:捕获特定异常

try:
    n = int(input("请输入数字:"))
    p = 10/n
except ValueError as result:
    print(result)
    print("请输入正确的整数")
except ZeroDivisionError as result:
    print(result)
    print('除0错误')

运行结果1:
在这里插入图片描述
运行结果2:
在这里插入图片描述

  • 从上面的例子可以看出,ZeroDivisionErrorValueError都是异常类,和Exception是相同性质的,区别是Exception是基类,可以捕获所有异常类,而ZeroValue是具体的特定异常类,只能捕获一种异常类.

  • 这里需要注意的是,在try语句块中,如果出现异常,则解释器会直接raise异常,后面的语句都不会执行,这里和函数中的return关键字的性质一样,例子如下:
try:
    n = int(input("请输入数字:"))
    p = 10/n
    print("你猜猜这里会调用吗?")
except ZeroDivisionError as result:
    print(result)
    print('除0错误')

运行结果:
在这里插入图片描述

举例2:捕获多个异常

  • 一种是区分优先级,则每个特定异常类都跟在except语句后;

格式如下:


try:
    可能存在异常的代码块
except 特定异常类1:

      print('异常说明1')
      
except 特定异常类2:
 
      print('异常说明2')
 
except 特定异常类3:
 
      print('异常说明3')
else :
	print('未发生异常')

执行特点:

  • try代码块中抛出(出现)异常,则按照except的顺序,依次查找抛出的异常属于哪一个except
  • 如果有Exception异常类捕获,一般默认放在最后一个except
  • 如果所有的except都不匹配,则执行else语句后的代码
  • 另一种是不区分优先级,则将多个特定异常类都跟在同一个except关键字后

格式如下:

try:
        可能存在异常的代码块
except (特定异常类1,特定异常类2...) as result:

      print('异常说明')
else :
	print('未发生异常')

举例:

try:
    n = int(input("请输入数字:"))
    p = 10/n
    print("你猜猜这里会调用吗?")   # 上面语句抛出异常,这条语句就不会执行了
except (ValueError,ZeroDivisionError) as result:
    print(result)
    print("发生错误了")

运行结果:
在这里插入图片描述

举例3:完整的异常格式

str = '人生苦短,我用Python'
try:
    int(str)            # 这里将字符串强制类型转换为int类型,会出错
except IndexError as result:
    print(result)
    pass
except KeyError as result:
    print(result)
    pass
except ValueError as result:
    print(result)
    pass
else:
    print('try内无异常')
finally:
    print('无论异常与否,都会执行该finally语句')

运行结果:
在这里插入图片描述

六、自定义异常类

要求:针对用户输入的密码长度进行异常捕获,自定义一个密码长度异常类,进行抛出异常和捕获异常.

代码:

class PassShortError(Exception):
    def __init__(self,len,m_len):
        self.len = len
        self.m_len = m_len

    def __str__(self):
        return "您输入的密码位数为%d,最小位数为%d" % (self.len,self.m_len)


try:
    password = input("请输入密码")
    if len(password) < 5:
        raise PassShortError(len(password),5)   # 这里抛出异常类
except PassShortError as result:     # 捕获异常
    print(PassShortError)        # 这里打印一下捕获的是什么异常类
    print(result)     # 这里是调用了result的魔法方法__str__
else:
    print("该密码输入没有错误")

运行结果:
在这里插入图片描述

  • 从上面的例子可以看出,实际工作中,我们需要根据实际需求自定义异常类,在定义异常类的时候,上面的就是最基础的自定义异常类的格式,可以按照这样的模板自己定义异常类.

总结

异常是我们在日常编码中绕不开的东西,我们可以把一些有可能发生异常的的代码块放在try/except中进行异常捕获,在面对程序报错的时候,仔细阅读异常提示,自己先尝试着解决问题,这样才可以得到更快更扎实的进步.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Philo`

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值