Я борюсь со следующим кодом. Моя цель - проверить, может ли быть выполнена arg строка, определяющая другое возвращаемое значение.

    def process(arg):
        try:
            return eval(arg)
        except:
            return arg

Пихарм говорит мне не использовать bare 'кроме' , но я не могу найти хорошую альтернативу. И мне также интересно, если это другой выбор?

0
AntiInsect 8 Июл 2019 в 15:56

3 ответа

Лучший ответ

Если вы просто используете except, то вы ловите все, что наследует от BaseException, включая такие вещи, как KeyboardInterrupt. Это, вероятно, не то, что вы намерены. Скорее всего, вы в конечном итоге будете маскировать ошибки, о которых вы на самом деле хотели знать.

На этой странице обсуждается потенциально полезное использование перехвата всех исключений - зарегистрировать исключение (например, на верхнем уровне программы или модуля) и немедленно повторно вызвать его. Этот бит о повторном повышении важен, потому что это означает, что вы не скрываете ошибку, когда не должны.

2
Hammerite 8 Июл 2019 в 13:04

Вероятно, вам нужно поймать и обработать определенный тип исключения.

Что-то вроде:

def process(arg):
        try:
            with open (arg) as myFile:
                return myFile.read()
        except IOError as e:
            # The file could not be read, some other IO related error
            print ("the file could not be read")
            raise e

Таким образом, вы узнаете, какой это тип ошибки и какова ее природа, и можете обрабатывать ее надлежащим образом, вместо того, чтобы перехватывать каждую ошибку и предполагать, что обнаруженная вами ошибка имеет определенный тип, или проверять тип во время выполнения.

1
user6767685user6767685 8 Июл 2019 в 13:04

«Моя цель - проверить, может ли быть выполнен аргумент, являющийся строкой»

Если вы хотите только проверить, может ли оно быть выполнено, используйте compile, он вызовет SyntaxError, если этого не может быть.

try:
    compile(arg)
except SyntaxError:
    return False
return True

В противном случае используйте Exception как исключение по умолчанию.

try:
    return eval(arg)
except Exception:
    return arg

Вы можете except разных исключений и решить, что возвращать на основе исключения тоже.

1
Jab 8 Июл 2019 в 13:12