注:本实验来源于 实验楼:python3简明教程 作者: FrostSigh
索引:
项目 | Value |
---|---|
1,异常处理 | try…except 例子 |
2,抛出异常 | raise语句 |
3,定义清理行为 | finally子句 |
挑战 | 玩转函数 |
我们使用try...except
块来处理任意异常。基本的语法:
try:
statements to be inside try clause
statements2
statements3
...
except ExceptionName:
statements to evalueted in case of ExceptionName happens
他的工作方式:
- 首先,执行try子句
- 如果没有异常发生,except子句在try语句执行完毕后就被忽略。
- 如果try子句执行过程中发生了异常,那么该子句其余部分会被忽略。
如果异常匹配于except关键字后面指定的异常类型,就执行对应的except子句。然后继续执行try语句之后的代码。 - 如果发生了一个异常,except没有与之匹配,会传递到上一级try语句中
如果最终找不到对应的处理语句,就会成为一个 未处理异常,终止程序运行,显示提示信息。
1,异常处理
def get_number():
"""Rutern a float number"""
number = float(input("Enter a float number: "))
return number
while True:
try:
print(get_number())
except ValueError:
print("We have a ValueError.")
先定义一个函数:让输入一个float类型的数并返回它;
然后在try子句中调用该函数,如果输入的是float类型数,则正确返回;如果不是则发生ValueError异常,在except子句中匹配到该异常,执行except子句;
最后我们ctrl + C 结束程序,发生KeyboardInterrupt异常,没有匹配到相应的except,打印错误信息。
2,抛出异常
使用raise语句来抛出一个异常
raise ValueError("A value error happend.")
可以用try…except语句来捕获raise语句抛出的异常
try:
raise ValueError("a Value Error happend.")
except ValueError:
print("Yes ,a Value Error has happend.")
3,定义清理行为
try语句还有另一个可选的finally子句。目的在于定义在任何情况下都一定要执行的功能。
如:
try:
raise KeyboardInterrupt
finally:
print("Goodebye, keyboard.")
不管有没有发生异常,finally子句在程序离开try后都一定会被执行。
在真实的应用程序中,finally子句用于释放外部资源(文件或网络连接之类)。
挑战
实现一个程序,将分钟数转换为小时和分钟。
注意:不能使用input()函数
import sys
def Hours(minutes):
if minutes < 0:
raise ValueError("Not True!")
else:
print("{} H, {} M.".format(int(minutes // 60), minutes % 60))
def main():
try:
Hours(int(sys.argv[1]))
except:
print("Parameter Error")
if __name__ == '__main__':
main()