例外是舒適地路由和處理非平凡程序中的錯誤的方式。但一個清晰的概念有助於在程序不斷增長的時候不要隨意破解它。
(如捕內置ValueError
遠或return
ING /偶然繼續很快就會變得毛茸茸的。)
有誤差之間的主要區別造成
- 由無效/奇用戶輸入
- 通過錯誤
- 受動態系統/環境限制。
分離,路由和處理這些錯誤的合理方法是:
(A)捕捉或潛在發生點附近很早就比較用戶輸入錯誤。立即作出反應,以進行簡單的恢復/重複。否則(打破了)轉換爲豐富例外可以被獲取,並進一步區分下來,或者在調用堆棧的底部(或默認處理程序sys.excepthook
)
(B)讓瀉而下的錯誤異常到調用堆棧的底部 - 未處理;或者可能啓動舒適的錯誤呈現和反饋操作。 (C)對於系統環境錯誤,在(A)和(B)之間選擇一種方法,具體取決於您希望在當前開發階段存在多少上下文,詳細信息&。
這樣,這可能成爲你的榜樣爲面向用戶的錯誤處理一個可擴展的模式:
# Shows scalable user oriented error handling
import sys, traceback
DEBUG = 0
class UserInputError(Exception):
pass
def excercise5():
print("Programming Excercise 5")
print("This program calculates the cost of an order.")
# NOTE: eval() and input() was dangerous
s = input("Enter the weight in pounds: ")
try:
pound = float(s)
except ValueError as ev:
raise UserInputError("Number required for weight, not %r" % s, ev)
if pound < 0:
raise UserInputError("Positive weight required, not %r" % pound)
shippingCost = (0.86 * pound) + 1.50
coffee = (10.50 * pound) + shippingCost
if pound == 1:
print(pound,"pound of coffee costs $", coffee)
else:
print(pound,"pounds of coffee costs $", coffee)
print()
if __name__ == '__main__':
try:
excercise5()
except UserInputError as ev:
print("User input error (please retry):")
print(" ", ev.args[0])
if DEBUG and len(ev.args) > 1:
print(" EXC:", ev.args[1], file=sys.stderr)
except (EnvironmentError, KeyboardInterrupt) as ev:
print("Execution error happend:")
print(" ", traceback.format_exception_only(ev.__class__, ev)[0])
except Exception:
print("Please report this bug:")
traceback.print_exc()
來源
2016-08-26 10:53:32
kxr
您必須使用try/catch語句。看看http://stackoverflow.com/questions/5424716/python-how-to-check-if-input-is-a-number-given-that-input-always-returns-stri – user1929959 2013-02-21 21:50:40