python - 创建了一个 python 程序来估计旅行时间并出现错误
问题描述
我已经让一切正常,但由于某种原因,当我输入 500 英里和 80 英里/小时时,它说输入无效。
这是我的代码。
import time
import datetime
from datetime import datetime
from datetime import timedelta
ch='y'
print("Arrival Time Estimator\n\n")
while ch!='n':
try:
est_date_dept = input('Estimated date of departure (YYYY-MM-DD):')
est_time_dept = input('Estimated time of departure (HH:MM AM/PM):')
dist = int(input('Enter Miles:'))
speed = int(input('Enter miles per hour:'))
travel_time = int(dist)/speed
t=timedelta(hours=travel_time)
t=str(t)
t=t.split(':')
if t[2] > '00':
t[1]=int(t[1])+1
travel_time+=0.01
time = datetime.strptime(est_time_dept, "%I:%M %p")
est_time_dept = datetime.strftime(time, "%H:%M")
est_date_dept = est_date_dept+" "+est_time_dept
arr_date_time = datetime.strptime(est_date_dept, "%Y-%m-%d %H:%M")
arr_date_time += timedelta(hours=travel_time)
est_arr = arr_date_time.strftime("%Y-%m-%d %I:%M %p")
est_arr=str(est_arr)
est_arr=est_arr.split()
print ('\n\nEstimated travel time')
print ('Hours:',t[0],'\nMinutes:', t[1])
print ('Estimated date of arrival:',est_arr[0])
print ('Estimated time of arrival:', est_arr[1], est_arr[2])
ch = input('\nContinue? (y/n):')
except:
print ("Invalid input")
ch = input("\nContinue? (y/n):")
我得到的输出是 输出
解决方案
如果您想知道出了什么问题,请不要使用except:
会丢弃该信息的裸机。
删除try:
/ except:
(至少暂时,用于调试),或将其更改为except Exception as e:
then print(f"Invalid input: {e!r}")
,或包含错误消息的内容。
对于您的输入,如果日期或时间无效,则实际异常如下所示:
ValueError("time data '19:23 AM' does not match format '%I:%M %p'")
在这种情况下,错误消息是正确的——输入无效。这并不是那么有用,因为你没有让用户知道他们的四个输入中的哪一个是无效的,或者为什么,但它是正确的。
但如果它们都是有效的,错误是这样的:
NameError("name 'est_arr' is not defined")
在这种情况下,调用输入无效是错误的。
你为什么会得到这个?好吧,让我们解决它:
travel_time = int(dist)/speed # int(500)/80 = 6.25
t=timedelta(hours=travel_time) # timedelta with 6:15:00
t=str(t) # the string '6:15:00'
t=t.split(':') # the list ['6', '15', '00']
if t[2] > '00': # not true, because '00' is not > '00'
# if body skipped
est_arr=est_arr.split() # oops, NameError
est_arr
如果时间是精确的分钟数(没有剩余秒数),您永远不会分配任何东西。
因此,当您尝试使用 时est_arr
,您会收到一条NameError
告诉您从未为该名称分配任何内容的信息。
你怎么能解决这个问题?好吧,我不知道你想在那里做什么。你为什么把它if
放在首位?当它不是真的时,你想要发生什么?我想不出任何好的理由,但大概你心里有一个。
推荐阅读
- python - Postgresql - Pgadmin:将 json 文件插入表中
- unity3d - unity AudioSource.Play 有噪音
- c# - 如何在对 Application Insights 友好的 Web API 中处理异常
- java - 安装 WAR 后,IBM WAS 9 在前 2 次调用特定方法时出错,然后在第 3 次调用和所有下一次调用中运行良好
- python - ConfigArgParse 忽略缩写选项?
- .net - .net RichTextBox - 自动设置字体
- ruby-on-rails - Activerecord rails 中的子查询
- angular - Angular Kendo UI Grid 使用 Detail Grid 递归加载
- node.js - 无法在 Windows 10 上安装 @vue/cli 3
- android - 如何检查给定 Firebase API 的可用性以避免我的日志中出现 FirebaseApiNotAvailableException 错误