2016-03-19 21 views
1

Ben dekore işlevi dekoratör ben kafa nasılDekoratörde dekore edilmiş işlev için istisna nasıl geçti?

def decorator(func): 
    def _decorator(request, *args, **kwargs): 
     if condition: 
      return func(request, *args, **kwargs) 
     else: 
      """ 
      THIS EXCEPTION CAN'T BE CAUGHT FROM FUNCTION DECORATED 
      """ 
      raise LimitReached 
return _decorator 

tarafından gündeme istisna yakalayabilirsiniz sevinirim?

+0

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

+1

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

+2

Yapamazsın. Func() 'çağrısı * zaten tamamlandı *. Bu nasıl çalışırdı, hangi noktada func() 'istisna kaldırılmalıdır? –

cevap

1

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 
İlgili konular