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

时间:2015-04-20 08:46:39

标签: python exit sys

该程序检查分子式。我希望程序在检测到公式中的错误时立即退出。例如,公式" 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

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

2 个答案:

答案 0 :(得分:9)

sys.exit引发SystemExit例外。您正在使用except子句来捕获它。

您应该做的是捕获更具体的异常类,其中不包括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更具体的内容(这是非常广泛的,并且可能会捕获您不打算捕获的异常)。

答案 1 :(得分:1)

因为在python中,exit事件被处理为SystemExit exception