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

Python sys.exit()在捕获异常时不退出程序,python,exit,sys,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

这个程序检查分子式。我希望程序在检测到公式中的错误后立即退出。例如,公式“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()
(“行末尾的未知原子”+getRest())那么为什么它仍然执行?我只希望打印输出的第一行。

因为在python中,退出事件作为
SystemExit
异常处理。
sys.exit
引发
SystemExit
异常。您正在使用
except
子句捕获它

您应该做的是捕获一个更具体的异常类,它不包括
SystemExit

捕捉
异常
将起作用:

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
的更多信息



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

不,你没有<代码>打印(…)在您的代码中位于
sys,exit()
之前。这就是为什么
除外:
通常是个坏主意…@Tichodroma他的意思是
sys.exit
在打印第一条消息后被调用,但第二条消息仍然被打印。顺便问一下,为什么
sys.exit()
之后返回
?你希望那能做什么?我知道,在CLC Intercal中,你可以“在仍然放弃的时候不要放弃”来模拟量子计算,但我认为这在Python中不起作用……太棒了!除了Formelfel,我写了
,它解决了我的问题,谢谢!