解释Python中的Try-Except错误

时间:2018-05-12 05:49:49

标签: python

我在运行try-except函数时遇到了麻烦(something_to_military)。在我的try部分中,我调用了另一个函数(is_time_format),我已经对其进行了全面的测试,并且在我尝试过的每个测试用例中都有效。但是,每当我调用后缀无效的值时,它都不会产生“无效时间格式”。我的一个朋友为is_time_valid写了一个不同的代码,但是我们对something_to_military有相同的代码。我知道我的is_time_format代码有问题,因为每当我使用诸如“2:45 AMX”之类的参数时,它不会导致我的something_to_military代码产生“无效时间格式”。有谁知道发生了什么事?

第2部分:ASSERT HELPER

def is_time_format(s):     msgstr“”“返回:如果s是12格式的字符串,则返回True:AM / PM

Example: 
    is_time_format('2:45 PM') returns True
    is_time_format('2:45PM') returns False
    is_time_format('14:45') returns False
    is_time_format('14:45 AM') returns False
    is_time_format(245) returns False

Parameter s: the candidate time to format
Precondition: NONE (s can be any value)"""
# HINT: Your function must be prepared to do something if s is a string.
# Even if s is a string, the first number before the colon may be one
# or two digits.  You must be prepared for either.
# You might find the method s.isdigit() to be useful.

pos1 = s.find(':')

pos2 = s.find(' ')

suff = s[pos2+1:]

x=s[:pos1]
y=s[pos1+1:pos2]
if type(s)!=type('str'):
    return False
elif x.isalpha == False:
    return False
elif y.isalpha == False:
    return False
elif s.count(':') != 1:       
    return False
elif x.isdigit() == False:
    return False
elif y.isdigit() == False:
    return False
elif len(x)>=3:
    return False
elif len(y)>=3:
    return False
elif int(x)>12:
    return False
elif int(y)>60:
    return False
elif suff !='AM' and suff !='PM':
    return False

else:
    return True

第3部分:TRY-EXCEPT

def something_to_military(s):     “”返回:适当的24小时(军事)格式的时间。

The function is the same as time_to_military if s satisfies the
precondition for that function.  If s does not satisfy the precondition
then this function returns 'Invalid time format'

Examples: 
    something_to_military('2:45 PM') returns '14:45'
    something_to_military('9:05 AM') returns '09:05'
    something_to_military('12:00 AM') returns '00:00'
    something_to_military(905) returns 'Invalid time format'
    something_to_military('abc') returns 'Invalid time format'
    something_to_military('9:05') returns 'Invalid time format'

Parameter s: the candidate time to format
Precondition: NONE (s can be any value)"""
# You are not allowed to use 'if' in this definition. Use try-except instead.
# Hint: You have to complete PART 2 before you complete this part.

try:
    is_time_format(s) == True
    return time_to_military(s)
except:
    return 'Invalid Time Format'

1 个答案:

答案 0 :(得分:1)

您定义is_time_format的方式(您没有向我们展示),它永远不会引发异常,只会返回TrueFalse

你打电话的方式:

is_time_format(s) == True

......也不会提出异常;您只需将TrueFalseTrue进行比较,然后忽略结果。

您想要的只是一个if声明:

if is_time_format(s):
    return time_to_military(s)
else:
    return 'Invalid Time Format'

由于您不允许这样做,您必须执行以下两项操作之一:

首先,您可以重写is_time_format,因此它会引发异常,而不是返回TrueFalse。基本上,将每return False更改为ValueError(f'{s} is not a time format')之类的内容,并将return True放在最后。 (当然,确保更改docstring以匹配行为。)

或者,你可以在False上写一些引发异常的东西。如果没有if,这将是人为的和愚蠢的,但也有选择。例如:

  • {True: True}[is_time_format(s)]会提出KeyError
  • assert is_time_format(s)会提出AssertionError
  • 1 / (1-is_time_format(s))会提出DivisionByZeroError