Python学习——捕获异常

根据B站 “黑马程序员” 的python教程记录笔记。

一、基本了解

看了标题之后可能会有疑惑:什么是捕获异常?为什么要捕获异常呢?

# 如果在开发中,对某些代码的执行不能确定是否正确,可以增加 try(尝试) 来 捕获异常
# 捕获异常最简单的语法格式:
try:
    尝试执行的代码
except:
    出现错误的代码

可能这样说还不够直观,那么我们通过一个实例来深入了解:

# 演练 -- 要求用户输入整数
# num = int(input("请输入一个整数:")) - 若用户输入一个字母则会报错
try:
    # 不能确定正确执行的代码
    num = int(input("请输入一个整数\n"))
except:
    # 对于错误的处理代码
    print("请输入正确的整数")

print("-" * 20)

运行结果:

二、捕获错误的类型

捕获异常可以捕获不止一个异常状况,对于没有想到的可能发生的错误也可以返回“未知错误”,并且可以返回错误的类型。

针对 不同类型的异常,做出不同的响应,这时需要捕获错误类型

语法:
try:
    尝试执行的代码
    pass
except 错误类型1:
    针对错误类型1,对应的代码处理
    pass
except (错误类型2,错误类型3):
    针对错误类型2 和 3,对应的代码处理
    pass
except Exception as result:
    print("未知错误 %s" % result)

捕获未知错误:开发时,要预判到所有可能出现的错误,是有一定难度的
如果希望程序无论出现任何错误,都不会因为 python 解释器抛出异常而被终止,可以再增加一个 except
当 python解释器抛出异常时,最后一行错误信息的第一个单词,就是错误类型

让我们通过实例加深理解:

try:
    num = int(input("输入一个整数:"))  # 输入可能为字母
    result = 8 / num  # 除数不能为0
    print(result)
except ZeroDivisionError:
    print("除0错误,输入的数不能为0")
except ValueError:
    print("值错误,请输入正确的整数")

 运行结果:

输入0时:

输入一个字母时: 

若没有想到有除0错误这个情况,又添加了未知错误的捕获:

try:
    num = int(input("输入一个整数:"))  # 输入可能为字母
    result = 8 / num  # 除数不能为0
    print(result)
# except ZeroDivisionError:
#     print("除0错误,输入的数不能为0")
except ValueError:
    print("值错误,请输入正确的整数")
except Exception as result:
    print("未知错误 %s" % result)

 输入0时的结果:

三、异常捕获的完整语法

基本的语法我们都知道了,现在来看看在一般情况下通用的完整语法是什么。

语法:
try:
    尝试执行的代码
    pass
except 错误类型1:
    针对错误类型1,对应的代码处理
    pass
except (错误类型2,错误类型3):
    针对错误类型2 和 3,对应的代码处理
    pass
except Exception as result:
    打印错误信息
    print("未知错误 %s" % result)
else:
    没有异常才会执行的代码
    pass
finally:
    无论是否有异常,都会执行的代码
    print("无论是否有异常,都会执行的代码")

还是通过一个实例来加深理解:

try:
    num = int(input("输入一个整数:"))  # 输入可能为字母
    result = 8 / num  # 除数不能为0
    print(result)

# except ZeroDivisionError:
#     print("除0错误,输入的数不能为0")
except ValueError:
    print("值错误,请输入正确的整数")
except Exception as result:
    print("未知错误 %s" % result)
else:
    print("尝试成功")
finally:
    print("无论是否有异常,都会执行的代码")

 运行结果:

输入字母:

输入0:

输入数字:

 

四、异常的传递

可能有人会问:我们都学会了怎么捕获异常,还要学什么异常的传递呢?

当然是因为它有用啦!

异常的传递--当函数/方法执行出现异常,会 将异常传递函数/方法调用一方
如果传递到主程序,仍然没有异常处理,程序才会被终止

说了这么多, 那到底好用在哪里呢?让我们接着往下看:

在开发中,可以在主函数中增加异常捕获
而在主数中调用的其他函数,只要出现异常,都会传递到主函数的 异常捕获 中
这样就不需要在代码中,增加大量的 异常捕获,能够保证代码的整洁

老样子,还是通过一个实例来加深理解:

# 需求:
# 1.定义函数 demo1() 提示用户输入一个整数并且返回
# 2.定义函数 demo2() 调用 demo1()
# 3.在主程序中调用 demo2()
def demo1():
    return int(input("输入整数:"))


def demo2():
    return demo1()


try:
    print(demo2())
except Exception as result:
    print("未知错误 %s" % result)

运行结果: 

 当不进行异常捕获的时候,可以从python的报错中看出传递顺序:

Python学习——捕获异常_第1张图片

 

五、应用

最后让我们来看看在什么场景中可以应用到这个知识吧!

# 在开发中,除了代码执行出错Python解释器会抛出异常之外
# 还可以根据应用程序特有的业务需求主动抛出异常
# 示例
# 提示用户 输入密码,如果 长度少于 8,抛出 异常

# 注意
# 当前函数 只负责 提示用户输入密码,如果 密码长度不正确,需要其他的函数进行额外处理
# 因此可以 抛出异常,由其他需要处理的函数 捕获异常

# 抛出异常
# Python 中提供了一个 Exception 异常类
# 在开发时,如果满足 特定业务需求时,希望 抛出异常,可以:
# 1.创建 一个 Exception的 对象
# 2.使用 raise 关键字 抛出 异常对象
# 需求
# 定义 inputpassword 函数,提示用户输入密码
# 如果用户输入长度 <8,抛出异常
# 如果用户输入长度 >=8,返回输入的密码
def input_password():
    # 提示用户输入密码
    pwd = input("请输入密码:")
    # 判断密码长度 >= 8,返回用户输入的密码
    if len(pwd) >= 8:
        return pwd
    # 如果 < 8,主动抛出异常
    print("主动抛出异常")
    # 1.创建异常对象 - 可以使用错误信息字符串进行使用
    ex = Exception("密码长度不够")
    # 2.主动抛出异常
    raise ex


# 提示用户输入密码
try:
    print(input_password())
except Exception as result:
    print(result)

运行结果:

密码长度不够时:

输入的密码满足条件时:

 

今天的学习就到这里啦!如有错误敬请指正。

你可能感兴趣的:(pyhton学习,python)