为什么即使我捕获异常,我的代码也会显示回溯?

时间:2018-02-08 23:55:52

标签: python exception traceback

这段代码表现得非常奇怪。我基本上复制了try / except块格式我在其他代码中使用的格式,因为它在另一个代码中运行良好。但是,在这一部分中,我得到了追溯的异常消息,我无法解释。

    def input_rows_columns():
        try:
            print("How many rows do you want?")
            rows = int(input("Rows: "))
            print("How many columns do you want?")
            columns = int(input("Columns: "))
        except ValueError:
            print("\nPlease insert numbers here\n")

        if rows <= 0 or columns <= 0:
            raise ValueError("\nPlease use numbers greater than zero here\n")

        return rows, columns


    def main():
        print("This program will make a barn for you")

        rows, columns = input_rows_columns()

        print(rows)
        print(columns)

    if __name__ == '__main__':
        main()

Here is an image of the traceback when you input zero:

Here is an image of the traceback when you input a string:

很抱歉,如果有更好的方法来追溯,这是我能想到的最好的

也许值得一提的是,当他在try中调用该函数时,第一个程序(我复制格式的程序)有另一个except / main()

    def main():
        print("This program will calculate the volume of a rectangular box given \
            its lenght, width, and height.\n")

        success = False
        try:
            # get_dimensions() has similar structure as the input_rows_columns() from the program above
            lenght, width, height = get_dimensions('Length', 'Width', 'Height')
            success = True
        except ValueError as e:
            print(e)
        except KeyboardInterrupt:
            print("\nGoodbye.")

        # success = True ficou implícito
        if success:
            volume = lenght * width * height
            print("\nThe volume of the box is %.2f." % volume)


    if __name__ == "__main__":
        main()

然而,当我将这个概念引入上层程序时,它并没有解决问题。

1 个答案:

答案 0 :(得分:0)

这与捕获错误与抛出(引发)的位置有关。

如果您没有raise您捕获的ValueError,则代码会继续沿着实际未定义行的路径继续。

你在哪里:

int(input("Rows: "))

...此代码在rows被分配之前执行,因此如果这样做会引发ValueError,它会冒泡到您的except ValueError行。现在您处于未分配rows的状态。

如果您想在此错误被触发后停止该程序,您只需raise或致电sys.exit()

except ValueError:
    print("\nPlease insert numbers here\n")
    raise