使用 If 语句检查是否出现错误

Using If Statements To Check If Something Raises An Error

我正在尝试编写一个程序来为我解决有关参数方程的问题。我正在尝试执行以下操作:

我正在尝试为参数方程找到 2 个答案。第一个答案将是正平方根。第二个答案将是负平方根。如果第一个平方根引发数学域错误,则不要找到第二个答案。这是我目前所拥有的:

def hitsGround(vertical_velocity, y_coordinate):
    h = vertical_velocity/-16/-2
    k = -16*(h)**2 + vertical_velocity*(h) + y_coordinate
    time = float(input("At what height do you want me to solve for time?: "))
    try:
        hits_height1 = math.sqrt((time - k)/-16) + h
    except ValueError:
        print("It won't reach this height.")
    else:
        print(f"It will take {hits_height1} seconds to hit said height.")

    try:
        hits_height2 = -math.sqrt((time - k)/16) + h
    except ValueError:
        print("There is no second time it will reach this height.")
    else:     
        print(f"It will take {hits_height2} seconds to hit said height.")

有没有什么方法可以使用 if 语句来检查第一个方程式是否会引发数学域错误,这样我就可以让它找不到第二个答案?谢谢!

您无法使用 if 测试 运行 时间异常;这正是 try-except 所做的。但是,当非法操作被如此直接定义时,您可以在尝试 sqrt 操作之前测试 that 条件:

if (time - k)/-16 < 0:
    # no roots
else:
    # proceed to find roots.

一般来说,使异常处理变得更容易的方法是在 except 内做所有你需要做的事情来处理异常。例如,如果您不想在遇到第一个异常后找到第二个答案,只需 return:

    try:
        hits_height1 = math.sqrt((time - k)/-16) + h
    except ValueError:
        print("It won't reach this height.")
        return

    print(f"It will take {hits_height1} seconds to hit said height.")

如果你想让生活更轻松,只需允许引发异常(根本不捕获它),然后在调用函数中捕获它!

def hitsGround(vertical_velocity, y_coordinate):
    h = vertical_velocity/-16/-2
    k = -16*(h)**2 + vertical_velocity*(h) + y_coordinate
    time = float(input("At what height do you want me to solve for time?: "))

    hits_height1 = math.sqrt((time - k)/-16) + h
    print(f"It will take {hits_height1} seconds to hit said height.")

    hits_height2 = -math.sqrt((time - k)/16) + h
    print(f"It will take {hits_height2} seconds to hit said height.")

try:
    hitGround(1.0, 10.0)
except ValueError:
    print("It won't reach that height again.")

无论在 hitsGround 中的什么地方引发异常,它都会立即停止该函数正在做的任何事情,并且它会命中调用范围中的 except。这样你只需要一个 try/except 来涵盖这两种情况。