Python Try-Except внутри функции - PullRequest
       47

Python Try-Except внутри функции

1 голос
/ 10 ноября 2010

У меня есть довольно хорошее представление о предложении python-исключения, но я сталкиваюсь с проблемами при попытке поместить его внутрь функции.не вижу заявление:Любая помощь приветствуется.

Ответы [ 6 ]

9 голосов
/ 10 ноября 2010

У меня есть довольно хорошее представление о предложении python-исключая

Нет. Ну, может быть, у вас есть, но тогда вам не хватает других, гораздо более важных областей. Либо вы ожидаете магического расширения области действия (каламбур не предназначен), либо вы не понимаете, в каком коде заказа оценивается ... Я предполагаю последнее. tryAppend(foo, var1) оценивается (приблизительно) в следующем порядке:

  1. Получить объект tryAppend ссылки
  2. Выбрать объект foo Ссылки
  3. Выбрать объект var1 Ссылки
  4. Вызовите первый со вторым и третьим аргументами (= делайте то, что делает функция tryAppend, исключая попытку-исключения)

Ошибка возникает в # 2, задолго до ввода функции и блока try. На самом деле, блок try не может выдать ошибку NameError, поскольку используются только имена parent и child, оба являются аргументами и, следовательно, всегда доступны (если .append не существует, это AttributeError).

Вы спрашиваете, почему

raise Exception("Catch me if you can")
try:
    pass # do nothing
except:
    print "caught it"

не печатает "поймал".

5 голосов
/ 10 ноября 2010

Это не имеет ничего общего с вашим обработчиком исключений. Вы видите ошибку, потому что «foo» нигде не определен.

4 голосов
/ 10 ноября 2010

Ошибка имени происходит до того, как она попадет в tryAppend. Он оценивает значение foo при попытке передать его функции. Это работает:

def tryAppend(child, parent):
    parent.append(child)

var1 = []
try:
    tryAppend(foo, var1)
except NameError:
    print 'WRONG NAME'
2 голосов
/ 10 ноября 2010

NameError выбрасывается при вычислении имени 'foo', что происходит до входа в функцию.Поэтому попытка / исключение внутри функции не имеет значения.

1 голос
/ 29 сентября 2015

Для тех, кто ищет, как использовать try, кроме конструкции внутри функции.Я не уверен, что это хороший стиль программирования, но он работает.

Вы можете поместить строковые аргументы в функцию.Он будет оценен правильно, и тогда вы можете использовать exec внутри функции:

def tryAppend(child, parent):
    try:
        script = parent + '.append(' + child + ')'
        exec script
        return parent
    except NameError:
        print "WRONG NAME"
var1 = []
var2 = 'test2'
tryAppend('var2', 'var1')
tryAppend('foo', 'var1')
0 голосов
/ 10 ноября 2010

foo исключение происходит даже до того, как вы введете функцию tryAppend(), т. Е. Вне функции.

...