Week 3 Exceptions
Exceptions
异常是在允许程序是出现的错误,更多详细请参考文档 Errors and Exceptions.
Try
在 Python 中,try
和 except
可以帮助我们在发生错误是进行检查,例子如下:
try:
x = int(input("What's x? "))
print(f"x is {x}")
except ValueError:
print("x is not an integer")
这段代码在输入非整数时就会出现自定义的提示信息,而不是 Python 默认的报错信息
但是对于上述代码来说,这并不是最佳的解决办法。在 try
代码中,应该尽可能少得放置可能认为会失败的代码。所以可以这样修改:
try:
x = int(input("What's x? "))
except ValueError:
print("x is not an integer")
print(f"x is {x}")
这样写为什么会出现上述报错?
分析:在第2行代码中,等式右边的函数是接受一个输入,并将这个输入转化成整数后,再进行赋值;但是当输入的是一个非整数时,int()
在这里就会报错,导致并没有将输入的值赋值给 x,所以在程序最后会显示 x 未定义的报错
else
在捕获异常的语句中,还可以使用 else
,代码修改如下:
try:
x = int(input("What's x? "))
except ValueError:
print("x is not an integer")
else:
print(f"x is {x}")
分析:
- 执行
try
语句中的代码 - 如果发生错误,则执行第4行代码
- 如果没有发生错误,则执行第6行代码
考虑上述代码在执行时,如果没有得到整数的输入也会直接结束程序,对用户并不友好,故修改代码如下:
while True:
try:
x = int(input("What's x? "))
except ValueError:
print("x is not an integer")
else:
break
print(f"x is {x}")
Creating a Function to Get an Integer
单独创建一个获取整数的函数:
def main():
x = get_int()
print(f"x is {x}")
def get_int():
while True:
try:
x = int(input("What's x? "))
except ValueError:
print("x is not an integer")
else:
break
return x
if __name__ == '__main__':
main()
可以将上述代码更加简化:
def main():
x = get_int()
print(f"x is {x}")
def get_int():
while True:
try:
x = int(input("What's x? "))
except ValueError:
print("x is not an integer")
else:
return x
if __name__ == '__main__':
main()
这里 return
的作用包括返回值和打断循环,而 break
的作用仅是跳出循环
还可以进一步简化:
def main():
x = get_int()
print(f"x is {x}")
def get_int():
while True:
try:
x = int(input("What's x? "))
return x
# return int(input("What's x? "))
except ValueError:
print("x is not an integer")
if __name__ == '__main__':
main()
pass
Python 官方参考文档 pass
假设这里用户输入有误,但不想每一次都提醒用户错误信息,那么可以这样做:
def main():
x = get_int()
print(f"x is {x}")
def get_int():
while True:
try:
x = int(input("What's x? "))
return x
except ValueError:
pass
if __name__ == '__main__':
main()
这里仅捕捉异常,但不对异常做任何处理,可以使用 pass
最后一项改进,这里给用户的提示语是在 get_int 函数中,而不是在主程序中。现在想修改,以便可以在主程序中自由编辑提示语:
def main():
x = get_int("What's x? c")
print(f"x is {x}")
def get_int(prompt):
while True:
try:
x = int(input(prompt))
return x
except ValueError:
pass
if __name__ == '__main__':
main()