Bu yapılamaz. Dekore edilmiş işlev bir iç kapsamdır ve dekoratörün dış kapsamında kaldırılan istisnaları yakalayamaz. Kodu çalıştırma ile ilgili üç adımı düşünün.
(1) Dekoratör, dekore edilen işlev çağrılmadan önce bazı kodları çalıştırır ... dekore edilmiş işlev, henüz çalıştırılmadığı için herhangi bir özel durumu yakalayamaz.
(2) Dekoratör dekore edilmiş işlevi çağırır ... Artık dekoratör çalışmadığı için bir istisna oluşturamaz.
(3) işlev döndürür ve dekoratör kodu tekrar çalışır ... dekore işlevi tamamlanmış yürütme nedeniyle bir şey yakalayamaz.
(düzenleme)
soruna bir çözüm yoktur. func
, bunun bir çeşit istisna tutması gerektiğini biliyor. Aynı func
, bir hata durumunda olduğunu belirten bir parametresi olması için yazılabilir. Ben
def func(p1, p2, kw1=None, errorstate=None):
if errorstate:
do_error_path()
return
def decorator(func):
def _decorator(request, *args, **kwargs):
if condition:
return func(request, *args, **kwargs)
else:
kwargs = kwargs.copy()
kwargs['errorstate'] = LimitReached()
return func(request, *args, **kwargs)
return _decorator
tek yolu bir istisna yakalamak mümkün ... Bu en iyi çözüm (bir dekoratör bile? Burada tabi) ama ikna edilebilir olduğundan emin değilim bir 'try' blokla olduğunu . 'Try' bloğu func()' nin herhangi bir yerinde görünebilir. Dekoratöre istisnayı nereye atacağını söyleyen nedir? – zondo
Eğer 'func' istisnayı nasıl yakalayabileceğinizi kastediyorsan, bu şekilde kodunuzu neden tasarladığınızı açıklamak için sorunuzu düzenleyebilir misiniz? Çağrı yığınının _down_ bir istisnasını iletmek mümkün değildir, ancak sorununuzu çözmenin farklı bir yolu olabilir. – snakecharmerb
Yapamazsın. Func() 'çağrısı * zaten tamamlandı *. Bu nasıl çalışırdı, hangi noktada func() 'istisna kaldırılmalıdır? –