python异常捕获及异常传递和自定义异常

1. 了解异常

  • 定义 程序出现错误
  • 作用 通过异常处理,使得出现错误的程序能够继续的执行下去,而不是直接中断

2. 异常写法

2.1 语法

try:
    可能异常的语句
except:
    如果出现异常执行的语句
  • 代码解释

打开一个文件,如果文件不存在,以 r 打开会报错,则以 w 模式打开

try:
    f = open('haha.txt', 'r')
except:
    f = open('haha.txt', 'w')

2.2 捕获指定异常

  • 语法
try:
    可能异常代码
except 异常类型:
    出现错误时执行的语句

try 中语句一般只为一句

如果指定的异常类型 和 出现的异常 不一致,无法捕获,会报错

  • 代码解释
try:
    # print(1/0)   # ZeroDivisionError
    print(num)   
except NameError:
    print('有错误')

2.3 捕获多个异常

try:
    print(num)
except (ZeroDivisionError,NameError):   # 将多个异常类型同时放一个元祖中
    print('有错误')

2.4 捕获异常的描述信息

try:
    print(num)
except (ZeroDivisionError,NameError) as result:    # 将捕获的异常信息放入result中
    print(result)

2.5 捕获全部异常

Exception 是所有错误类型的父类

try:
    print(num)
except Exception as result:
    print(result)

2.6 异常的else 和 finally

如果try没有错误,则继续执行else中命令

如果有错误,则不执行

不管有没有异常都会执行 finally 中语句

try:
    f = open('haha.txt', 'r')
except:
    f = open('haha.txt', 'w')
else:
    print('haha,no worry!')   # 如果没有异常,则执行
finally:
    f.close()    # 最后都会关闭文件

3. 异常传递

通过嵌套try语句,由外向内传递异常,先执行外部try

  1. 读取文件,如果存在则读取,否则输出异常
  2. 读取内容时:如果检测到程序被终止,则输出异常
import time
try:
    f = open('hello.txt')
    try:
        while True:
            con = f.readline() # 不断读取文件内容
            if len(con) == 0:
                break
            time.sleep(3)   # 程序休眠3秒
            print(con)
    except:
        # 通过Ctrl+c 主动终止程序
        print('程序被意外终止了!')
except Exception as result:
    print()
else:
    f.close()

4. 自定义异常

  • 用途:当某些错误不属于语法错误,而是需求逻辑上的错误,需要自定义异常,如密码长度
  • 语法:
    • 先自定义一个类,继承Exception类,通过__str__特殊方法返回错误信息
    • 然后在try中如果出现错误则通过raise抛出自定义的异常类
  • 代码解释
# 1. 自定义一个异常类
class Password_len_detect(Exception):

    def __init__(self,plen,min_len):
        self.length = plen
        self.min_len = min_len
#2. 设置抛出异常的描述信息
    def __str__(self):
        return f'输入密码长度为{self.length},密码最小长度要求{self.min_len}'

def main():

    try:
        password = input('请输出密码:')
        length = len(password)
# 3. 通过 raise 调用自定义的异常类
        if length < 3:
            raise Password_len_detect(length,3)
# 4. 最后通过Exception捕获语法异常             
    except Exception as result:
        print(result)
    else:
        print('密码设置成功!')

main()

5. 总结

  • 基本异常
try:
    
except:

else:

finally:
  • 捕获异常及描述信息
except (多个异常元祖) as result:
    print(result)
    
except Exception as result:
    print(result)
  • 异常传递
try:
    try:
    
    except:

except
  • 自定义异常
1. 自定义错误类
class 自定义类(Exception):
    ...
2. 返回错误信息    
    def __str__(self):
        return 错误信息

try:
3. 出现错误信息抛出自定义错误类
    raise 自定义错误类

4. 最后通过Exception捕获语法异常    
except Exception as result:
    print(result)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值