为什么即使我捕获了异常,我的代码也会显示回溯?
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
这段代码表现得很奇怪。我基本上复制了我在另一个代码中使用的 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