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

Sah*_*and 0 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()
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

Missing capital letter and end of row a
Unknown atom at end of row
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*zco 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()
Run Code Online (Sandbox Code Playgroud)

您可以SystemExit 在文档中了解有关异常的更多信息.


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