目录[-]

在进行程序开发以及测试时,经常会遇到一些异常情况导致程序崩溃,究其原因,其一在于编程疏忽导致异常,其二在于考虑不周全导致异常,其三在于对编程语言不熟悉导致的异常。在实际开发工作中,异常可以减少,但有些异常是不可避免的,如果我们没有对异常进行捕获处理,则程序可能因异常而退出。


1. 内置异常

Python中一切皆是对象,因此异常也是对象。BaseException是所有内置异常的基类,但用户定义的异常类不直接继承于BaseException,而是从Exception类继承。


2. 捕获所有异常

在进行程序开发时,如果不确定某段代码能否正常运行,则可采用 try ... except: 关键字来进行异常捕获。捕获所有异常虽然可用,但采用该方式进行异常捕获时,系统无法判断出异常类型,因此并不建议这么做。

# 尝试执行 try 下的代码块
try:
    # 正常情况下,用户会输入数字,然后程序可以正常执行,但是我们无法
    # 阻止用户输入非数字型,当用户输入非数字型时,程序会检测到异常
    # 进而执行except 下的代码块
    input_value = int(input("请输入数字:"))
    print("%d" % input_value)
# try 下的代码块正常执行完毕时,不会执行 except 下的代码块。
# try 下的代码块出现任何异常时,都会执行 except 下的代码块;
except:
    print("发生错误!!!")

3. 捕获特定类型异常

更进一步,有时我们需要针对不同类型的异常,作出不同的响应。这个时候我们就需要捕获特定类型的异常。采用 try ... except 异常类型:  即可针对特定的异常进行处理。比如以下代码段如果输入了不合适的值类型,则程序会导致异常,打印输出“函数接收到了具有正确类型的数据,但值不合适”。

try:
    input_value = int(input("请输入数字:"))
    print("%d" % input_value)
# ValueError:函数接收到了具有正确类型的数据,但值不合适
except ValueError:
    print("函数接收到了具有正确类型的数据,但值不合适")

4. 查看异常类型

当Python解释器抛出异常时,最后一行错误信息的第一个单词即为错误类型。


5. 捕获未知异常

try:
    input_value = int(input("请输入数字:"))
    print("%d" % input_value)
# 捕获特定的异常类型:ValueError
# ValueError:函数接收到了具有正确类型的数据,但值不合适
except ValueError:
    print("函数接收到了具有正确类型的数据,但值不合适")
except Exception as result:
    print("未知错误:%s" % result)

6. 完整的捕获异常

try:
    # 尝试执行的代码
    pass
except 错误类型1:
    # 针对错误类型1,进行处理的代码块
    pass
except 错误类型2:
    # 针对错误类型2,进行处理的代码块
    pass
# except可以接收元祖类数据类型
except (错误类型3, 错误类型4):
    # 针对错误类型3和类型4,进行处理的代码块
    pass
# 捕获错误数据类型并打印出来
except Exception as result:
    # 打印错误信息
    print(result)
else:
    # 没有尝试执行的代码块没有出现异常,则try代码块执行结束后,
    # 会执行else下的代码块
    pass
finally:
    # 无论尝试执行的代码块是否出现异常,都会执行finally下的代码块
    print("无论是否有异常,都会执行的代码")

7. 用户主动抛出异常

​以请用户输入账号密码来进行测试,如果密码输入位数少于6位,则抛出"密码长度不够"异常。

def input_password():
    # 1. 提示用户输入密码
    pwd = input("请输入密码:")
    # 2. 判断密码长度,如果长度 >= 6,返回用户输入的密码
    if len(pwd) >= 6:
        return pwd
    # 3. 密码长度不够,需要抛出异常
    # 1> 创建异常对象 - 使用异常的错误信息字符串作为参数
    ex = Exception("密码长度不够")
    # 2> 抛出异常对象
    raise ex

8. 异常传递

  • 当函数/方法执行时出现异常,则会将异常传递给函数/方法调用方。

  • 开发中,一般可以在主函数中增加异常捕获。

  • 根据异常传递原则,在主函数中调用的其他函数,只要出现异常,都会传递到主函数的异常捕获处理中。

  • 将异常处理放置在主函数中,可以避免在代码中增加大量的异常捕获,进而保证代码的整体整洁。

  • 如果捕获的异常传递到来主程序,仍然没有针对异常进行处理,则主程序会停止运行。