sys.exit() не выходит из программы при перехвате исключений

Эта программа проверяет молекулярные формулы. Я хочу, чтобы программа завершала работу, как только обнаружит ошибку в формуле. Например, формула «а» неверна. Когда я запускаю его через свой код:

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()), так почему же он все еще выполняется? Я хочу, чтобы печаталась только первая строка вывода.


person Sahand    schedule 20.04.2015    source источник
comment
Нет, ты не сделал. print(...) стоит перед sys,exit() в вашем коде.   -  person    schedule 20.04.2015
comment
именно поэтому except: обычно плохая идея…   -  person abarnert    schedule 20.04.2015
comment
@Tichodroma Он имеет в виду, что sys.exit был вызван после печати первого сообщения, но второе сообщение все еще было напечатано.   -  person interjay    schedule 20.04.2015
comment
Кстати, а почему return после sys.exit()? Что вы надеялись, что это сделает? Я знаю, что в CLC-Intercal вы можете ВОЗДЕРЖАТЬСЯ ОТ СДАЧИ, В ТО ВРЕМЯ СДАВАЯСЬ, чтобы эмулировать квантовые вычисления, но я не думаю, что это работает в Python…   -  person abarnert    schedule 20.04.2015


Ответы (2)


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 в документации.


Обратите внимание, что в идеале вы должны перехватывать что-то более конкретное, чем Exception (что очень широко и может перехватывать исключения, которые вы не собираетесь перехватывать).

person Thomas Orozco    schedule 20.04.2015
comment
Великолепно! Я написал except Formelfel, и это решило мою проблему, спасибо! - person Sahand; 20.04.2015

Потому что в python событие выхода обрабатывается как исключение SystemExit

person user3159253    schedule 20.04.2015