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

Why does my code show traceback even when I catch the exception?

这段代码表现得很奇怪。我基本上复制了我在另一个代码中使用的 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:

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

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

    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()

但是我在上层程序中引入这个概念并没有解决问题

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

如果您不 raise 您捕捉到的 ValueError,代码将继续执行实际未定义行的路径。

你在哪里:

int(input("Rows: "))

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

如果您想在遇到此错误后停止程序,您可以简单地 raise 或调用 sys.exit()

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