n‑ar fi bad practice Nu s‑ar povesti >>> def log_errors(func): ... def wrapper(*args, **kwargs): ... try: ... return func(*args, **kwargs) ... except Exception as exc: ... print("Raised %r for %s/%s" % (exc, args, kwargs)) ... raise exc ... return wrapper Ce nu e bine ?
>>> def unu(): ... doi() >>> def doi(): ... raise Exception("Dezastru ...") >>> foobar() Traceback (most recent call last): ... File "<doctest decoratori.rst[...]>", line ..., in wrapper ... Exception: Dezastru ... Care wrapper ? Numele e prea generic. Traceback‑ul nu contine informatii despre doi si unu (în Python 2)
decise la compilare: Funcția cea de toate zilele ... Funcția generator, dracul împielițat: are yield poate avea return (gol) poate avea return valoare (doar în Python 3) Așadar, funcția generator intoarce un generator. Dacă excepția este aruncată după ce a început iterarea atunci decoratorul nostru nu o poate prinde. Trebuie sa consumam generatorul ( for i in ...: yield i )