Как я могу перехватить исключение, возникшее внутри предложения catch, если предложение finally, соответствующее предложению catch, содержит оператор return? - PullRequest
0 голосов
/ 25 октября 2019

Предположим, что:

  • TEF является блоком try-except-finally.
  • возникает исключение из условия try в TEF
  • Предложение finally, F блока T содержит оператор возврата
  • TEF содержит исключающее предложение E
  • исключение e возникает внутри E
  • Как мы можем поймать e снаружи предложения F и снаружиE?

Если это сбивает с толку, то ниже показан код:

def e():
    out = "hello world"
    try:
        raise ValueError("my name is Sarah")
    except BaseException as exc:

        # HOW DO I CATCH THE FIRST OF THE FOLLOWING
        # exceptions from outside of this, current,
        # except clause?

        raise ValueError("secret info it would be good to know")
        raise AttributeError
        raise type("Hell", (Exception,), dict())()
        [0, 1, 2][99999]

        class AnythingYouCanThinkOf(Exception):
            pass

        raise AnythingYouCanThinkOf

        out = "definitely not `hello world`"
    finally:
        return out

print(e())
print("No error!!! wowza!")

Код выше печатает:

hello world
No error!!! wowza!

Если мы закомментируем строку out = "hello world", то получим UnboundLocalError: local variable 'out' referenced before assignment. Тем не менее, я все еще не уверен, как восстановить ValueError("secret info it would be good to know")

Кроме того, если вы поместите почти тот же код вне функции e, вы получите очень разные результаты. Почему?

if True:
    out = "hello world"
    try:
        raise ValueError("my name is Bob")
    except BaseException as exc:

        # HOW DO I CATCH THE FIRST OF THE FOLLOWING
        # exceptions from outside of this, current,
        # except clause?

        raise ValueError("what is this madness?")

        class AnythingYouCanThinkOf(Exception):
            pass

        raise AnythingYouCanThinkOf

        out = "definitely not `hello world`"
    finally:
        print(out)

Вышеуказанное приводит к необработанному исключению ValueError: what is this madness? до того, как мы получили No error!!! wowza!

...