通过这种简单的异常处理,我应该在哪里打印输出?(Python)

时间:2018-11-19 07:37:47

标签: python python-3.x exception-handling

大家好,在“ try”子句中打印我的输出还是在“ except”子句后加上“ else:”将我的输出打印出来? 这是代码:

try:
    Value1 = int(input("Type the first number: "))
    Value2 = int(input("Type the second number: "))
    Output = Value1 / Value2
except ZeroDivisionError:
    print("Attempted to divide by zero!")
else:
    print(Output)

还是这个?

try:
    Value1 = int(input("Type the first number: "))
    Value2 = int(input("Type the second number: "))
    Output = Value1 / Value2
    print(Output)
except ZeroDivisionError:
    print("Attempted to divide by zero!")

我的意思是哪个更好?因为结果是一样的。 谢谢。

3 个答案:

答案 0 :(得分:0)

else子句仅在未引发异常时运行。

因此要在其中放置它的原因是要使其明确:仅在没有例外的情况下才打印输出

正如您提到的,在您的代码中,发生的事情没有功能上的差异。

有关更多信息,请参见docs

答案 1 :(得分:0)

第一个将按照您的期望正常工作(假设您不想显示python错误提示并暂停程序)。 它只是规定 IF 第二个数字为零,则它不会打印Python错误提示并将其传递给print命令(这就是应该的样子)。否则,在任何其他情况下,无论除数是多少,它都将始终提供输出,从而消除几乎所有漏洞。

建议: 保持输入类型为float而不是int,这样您就可以打印除以十进制数字形式的除法。前2/3

答案 2 :(得分:0)

就像您已经知道我们在使用try...except时所讨论的错误处理一样。
当某个操作(或其他语句)生成错误时,Python将停止try块执行,并向下传递到与引发的异常匹配的第一个 except块。 如果没有匹配我们异常的except子句,则在外部try语句中传递它。直到处理完毕或未找到任何处理程序为止,引发的异常将成为 未处理的异常 ,并停止执行并显示错误回溯的消息。

除了except块,我们还可以使用 finally块,无论是否发生异常,都将执行该块,否则将执行else块。对于try子句未引发异常的必须执行的代码,最后一个有用。

您的示例

您怎么说这两段代码可以得到相同的结果。但是,在Python的documentation页上阅读后,我们得到了以下确认:

  

使用 else 子句比在try子句中添加其他代码更好,因为它避免了意外捕获由<保护的代码未引发的异常。 strong>尝试...,语句除外。

简单地说,如果您有引发相同错误的不同语句,但是对于其中一个您不希望捕获该语句,请将其移至else子句。查看此question on stack可以更好地理解。

因此,在您的情况下,可以让print语句在try块中,因为您不会从中捕获某些特定的异常,并且在这种情况下,您放置print语句并没有太大区别。但是,我认为第二个示例是一个很好的逻辑分离,类型为“如果发现错误,则执行打印”。