2011-09-19 4 views
5

में इटरेटर/जेनरेटर में अपवाद बढ़ाने के बाद जारी रखें क्या पाइथन में इटरेटर/जेनरेटर द्वारा फेंकने के अपवाद के बाद पुनरावृत्ति जारी रखने का कोई तरीका है? नीचे दिए गए कोड की तरह, क्या ZeroDivisionError को छोड़ने और gener() के माध्यम से modyfying run() फ़ंक्शन के बिना लूपिंग जारी रखने का कोई तरीका है?पायथन

def gener(): 
    a = [1,2,3,4,0, 5, 6,7, 8, 0, 9] 
    for i in a: 
     yield 2/i 

def run(): 
    for i in gener(): 
     print i 

#---- run script ----# 

try: 
    run() 
except ZeroDivisionError: 
    print 'what magick should i put here?' 

उत्तर

8

try/except के लिए तार्किक जगह जगह है जहाँ हमलावर गणना लेता जगह होगा:

def gener(): 
    a = [1,2,3,4,0, 5, 6,7, 8, 0, 9] 
    for i in a: 
     try: 
      yield 2/i 
     except ZeroDivisionError: 
      pass 
+1

इस साधारण मामले में शायद हां। लेकिन क्या होगा यदि हम एक ऐसा फ़ंक्शन चाहते हैं जहां डिफ़ॉल्ट रूप से पुनरावृत्ति रोक दी जाती है लेकिन हम अगले आइटम को अपवाद को पकड़ने के साथ जारी रख सकते हैं? हमारे पास बाहरी सिग्नल होना चाहिए कि कुछ गलत है। – sergzach

+0

@sergzach: हम 'पास' के बजाय' उपज नहीं 'की तरह कुछ कर सकते हैं और कॉलर में उस विशेष मामले को पकड़ सकते हैं। –

2

एक संभव समाधान सिर्फ ब्लॉक को छोड़कर कोशिश ... में समस्या कोड लपेटकर है:

def gener(): 
    a = [1,2,3,4,0, 5, 6,7, 8, 0, 9] 
    for i in a: 
     try: 
      div_result = 2/i 
     except ZeroDivisionError: 
      div_result = None 

     yield div_result 
0

मुझे यकीन है कि नहीं कर रहा हूँ, लेकिन शायद यह आप बेहतर सूट अगर आप अभी भी समझने के लिए जहां त्रुटियां हुईं हैं:

def gener(): 
    a = [1, 2, 3, 4, 0, 5, 6, 7, 8, 0, 9] 
    errors = [] 
    for idx, i in enumerate(a): 
     try: 
      yield 2/i 
     except ZeroDivisionError: 
      errors.append('ZeroDivisionError occured at idx = {}'.format(idx)) 
    raise RuntimeWarning('\n'.join(errors))