Python 练习:如果 s 不是上面指定的格式,则引发异常 SyntaxError
Posted
技术标签:
【中文标题】Python 练习:如果 s 不是上面指定的格式,则引发异常 SyntaxError【英文标题】:Pyhton exercise : Raise the exception SyntaxError if s is NOT in the format specified above 【发布时间】:2021-12-19 02:08:27 【问题描述】:我在要求我做的 codio 上做练习
如果 s 不是上面指定的格式,则引发异常 SyntaxError 如果 s 是上述格式,则引发异常 ValueError,但罚分大于标记
现在下面的代码工作得很好,我确信我并没有走得太远,但是缺少一些东西
当我在 codio 中测试我的代码时,我得到以下信息
FAIL: test_2 (test_calculate_mark.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/codio/workspace/.guides/secure/calculate_mark/test_calculate_mark.py", line 17, in test_2
calculate_mark("john xx 30")
AssertionError: SyntaxError not raised : ----------------------------------------------------------------------
我们尝试过:
calculate_mark("john xx 30")
并没有得到SyntaxError
异常
def calculate_mark(s):
mystring= s.split()
m=s.replace(" ", "")
try:
assert m.isdigit() == True, "SyntaxError"
student_number=(mystring[0])
student_mark=int((mystring[1]))
student_penanlty=int((mystring[2]))
assert student_penanlty <student_mark , "ValueError"
mycalc=student_mark-student_penanlty
final_mark=student_number + " "+ str(mycalc)
return final_mark
except AssertionError as msg:
print(msg)
calculate_mark("123 35 50")
【问题讨论】:
正如 Nils 所说,您使用raise
引发异常,而不是 assert
。这适用于您在此处使用assert
。如果您的测试应用需要捕获您的异常,您当然不想使用try/except
。
assert
的第二个参数是 reason,它包含在引发的 AssertionError 中。也就是说,如果你打印str(msg)
,你会得到你指定的原因(例如上面指定的'SyntaxError')
【参考方案1】:
您实际上必须raise
Exception:
raise SyntaxError()
然后把它清理干净
def calculate_mark(s):
splits = s.split()
try:
splits = [int(s) for s in splits]
except ValueError: # at least one of splits is not an integer
raise SyntaxError("Please pass exactly three integer strings")
number, mark, penalty = splits
if penalty < mark:
raise ValueError("penalty must be larger than mark")
return f"number mark - penalty"
print(calculate_mark("123 35 50"))
【讨论】:
永远不要与 True 比较。只需写if not m.isdigit():
。
哎呀,你是对的,我只是盲目地复制了 Q 中的内容。以上是关于Python 练习:如果 s 不是上面指定的格式,则引发异常 SyntaxError的主要内容,如果未能解决你的问题,请参考以下文章