sys.exit() 捕获异常时不退出程序

sys.exit() does not exit program when catching exceptions

此程序检查分子式。我希望程序在检测到公式错误后立即退出。例如,公式 "a" 是不正确的。 当我 运行 通过我的代码时:

def readletter():
    if q.peek() in string.ascii_lowercase:
        print(q.peek())
        return q.get()
    else:
        raise Formelfel("Förväntad liten bokstav.")

def readLetter():
    if q.peek() in string.ascii_uppercase:
        print(q.peek())
        return q.get()
    else:
        raise Formelfel("Förväntad stor bokstav.")

def readAtom():
    X = ""
    try:
        X += readLetter()
    except Formelfel:
        print("Missing capital letter at end of row "+getRest())
        sys.exit()
        return

    try:
        x = readletter()
        atom = X+x
    except (Formelfel, TypeError):
        atom = X

    if atom in ATOMER:
        return
    else:
        raise Formelfel("Okänd atom.")

def readGroup():
    if q.peek() in string.ascii_uppercase or q.peek() in string.ascii_lowercase:
        try:
            readAtom()
        except:
            print("Unknown atom at end of row "+getRest())
            sys.exit()

我得到这个输出:

Missing capital letter and end of row a
Unknown atom at end of row

这是为什么?我在 print("Unknown atom at end of row "+getRest()) 之前调用了 sys.exit() 为什么它仍然执行?我只想打印输出的第一行。

因为在 python 中退出事件被处理为 SystemExit 异常

sys.exit 引发 SystemExit 异常。您正在使用 except 子句捕获它。

您应该做的是捕获更具体的 class 个异常,其中不包括 SystemExit

捕捉 Exception 会起作用:

def readGroup():
    if q.peek() in string.ascii_uppercase or q.peek() in string.ascii_lowercase:
        try:
            readAtom()
        except Exception:
            print("Unknown atom at end of row "+getRest())
            sys.exit()

您可以详细了解异常和 SystemExit in the docs


请注意,理想情况下,您应该捕获比 Exception 更具体的内容(它非常广泛,可能会捕获您不打算捕获的异常)。