目录[-]
在进行程序开发以及测试时,经常会遇到一些异常情况导致程序崩溃,究其原因,其一在于编程疏忽导致异常,其二在于考虑不周全导致异常,其三在于对编程语言不熟悉导致的异常。在实际开发工作中,异常可以减少,但有些异常是不可避免的,如果我们没有对异常进行捕获处理,则程序可能因异常而退出。
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. 异常传递
-
当函数/方法执行时出现异常,则会将异常传递给函数/方法调用方。
-
开发中,一般可以在主函数中增加异常捕获。
-
根据异常传递原则,在主函数中调用的其他函数,只要出现异常,都会传递到主函数的异常捕获处理中。
-
将异常处理放置在主函数中,可以避免在代码中增加大量的异常捕获,进而保证代码的整体整洁。
-
如果捕获的异常传递到来主程序,仍然没有针对异常进行处理,则主程序会停止运行。