2012-03-10 11 views
36

कई कोशिश/छोड़कर/आखिरकार खंड न केवल मेरे कोड को "उलझन" करते हैं, लेकिन मैं अक्सर इसी तरह के कार्यों के लिए समान अपवाद-हैंडलिंग का उपयोग करता हूं। तो मैं उन्हें "आउटसोर्सिंग" द्वारा सजावट को कम करने पर विचार कर रहा था ... सजावटी।"आउटसोर्सिंग" एक सजावटी को अपवाद-हैंडलिंग

क्योंकि मुझे यकीन है कि इस निष्कर्ष पर आने वाला पहला व्यक्ति नहीं होना चाहिए, मैंने इसे गुमराह किया और पाया - imho - ingenious recipe जो एक से अधिक अपवाद को संभालने की संभावना को जोड़ता है।

लेकिन मुझे आश्चर्य हुआ कि यह एक व्यापक ज्ञात और प्रयुक्त अभ्यास क्यों नहीं प्रतीत होता है, इसलिए मैं सोच रहा था कि क्या कोई पहलू है जिस पर मैं विचार नहीं कर रहा था?

  1. क्या यह अपवाद-हैंडलिंग के लिए सजावटी पैटर्न का उपयोग करने के लिए फर्जी है या क्या मैंने इसे पूरे समय याद किया है? कृपया मुझे ज्ञान दो! नुकसान क्या हैं?

  2. क्या वहां कोई पैकेज/मॉड्यूल भी हो सकता है जो उचित तरीके से ऐसे अपवाद-संचालन के निर्माण का समर्थन करता है?

+0

मैं जवाब में देख रहा हूँ, और मैं बस सोचा ... यदि आप refactor करने के लिए थे फ़ंक्शन के रूप में एक साथ कई समान त्रुटि कार्यों को संभालने के लिए ... क्या आपने अभी तक एक सजावट में कक्षा विधि के लिए प्रारंभिक बिंदु नहीं बनाया है? – Droogans

+0

मैं आपका अनुसरण नहीं कर सकता, क्षमा करें। क्या आपका मतलब है, मुझे सजावटी दृष्टिकोण का उपयोग करना चाहिए और ताजा निर्मित अपवाद-सजावट-कक्षा के साथ मौजूदा कोड को दोबारा इस्तेमाल करना चाहिए, या क्या आपका मतलब है कि मुझे सजावट की आवश्यकता नहीं है, क्योंकि मैं प्रति-वर्ग अपवाद हैंडलिंग विधि का उपयोग कर सकता हूं? –

+1

मेरा मतलब यह था कि, यदि आपने किसी विधि में अधिकांश त्रुटि प्रबंधन का विवरण निकाला है, तो आपने एक सजावट के रूप में उपयोग करने के लिए * कक्षा * में सारणी के लिए 80% काम किया है। मेरी राय? यह थोड़ी देर में आपके काम को हर बार बढ़ा सकता है, लेकिन सामान्य त्रुटि प्रबंधन कार्यों के बाहर की घटनाओं से निपटने के लिए, आप हमेशा जानते हैं, लिख सकते हैं, 'प्रयास करें' टाइप करें: विधि में ब्लॉक को छोड़कर। – Droogans

उत्तर

20

कोड में कोशिश/छोड़ने/आखिरकार ब्लॉक को रखने का सबसे बड़ा कारण यह है कि त्रुटि पुनर्प्राप्ति आमतौर पर फ़ंक्शन का एक अभिन्न हिस्सा होता है।

उदाहरण के लिए, यदि हम अपने ही int() समारोह था:

def MyInt(text): 
    return int(text) 

हम क्या करना चाहिए अगर text परिवर्तित नहीं किया जा सकता है? वापसी 0? वापसी None?

यदि आपके पास कई साधारण मामले हैं तो मैं एक साधारण सजावटी उपयोगी हो सकता हूं, लेकिन मुझे लगता है कि आप जिस नुस्खा से जुड़े हैं, वह बहुत अधिक करने की कोशिश करता है: यह प्रत्येक संभावित अपवाद के लिए एक अलग फ़ंक्शन को सक्रिय करने की अनुमति देता है - मामलों में जैसे कि (कई अलग-अलग अपवाद, कई अलग-अलग कोड पथ) मैं एक समर्पित रैपर फ़ंक्शन की अनुशंसा करता हूं।

class ConvertExceptions(object): 

    func = None 

    def __init__(self, exceptions, replacement=None): 
     self.exceptions = exceptions 
     self.replacement = replacement 

    def __call__(self, *args, **kwargs): 
     if self.func is None: 
      self.func = args[0] 
      return self 
     try: 
      return self.func(*args, **kwargs) 
     except self.exceptions: 
      return self.replacement 

और नमूना उपयोग::

यहाँ एक सरल डेकोरेटर दृष्टिकोण पर मेरी ले है

@ConvertExceptions(ValueError, 0) 
def my_int(value): 
    return int(value) 

print my_int('34')  # prints 34 
print my_int('one')  # prints 0 
4

असल में, दोष यह है कि अब आप यह तय नहीं कर पाएंगे कि कॉलिंग संदर्भ में अपवाद को कैसे संभालना है (केवल अपवाद प्रचार को छोड़कर)। कुछ मामलों में इसका परिणाम जिम्मेदारी को अलग करने की कमी हो सकती है।

+0

क्या मैं अलग-अलग हैंडलर-मेहटोड्स का उपयोग करके अभिनेता/रिएक्टर के इस युग्मन-मुद्दे को संबोधित नहीं कर सकता? मैं हर प्रभावित वर्ग में एक वर्ग विधि भी परिभाषित कर सकता था। –

+1

आपको कॉलर द्वारा प्रदान किए गए हैंडलर में हुक करने में सक्षम होने के लिए अपने सजावटी की आवश्यकता होगी, और उस बिंदु पर आपने शायद वास्तविक लाभ के लिए जटिलता को जोड़ा है (जब तक कि आपका प्रोग्राम अविश्वसनीय रूप से बड़ी संख्या में अपवाद हैंडलिंग करता है जो आम तौर पर फोड़े कुछ आम रूपों तक नीचे, और फिर भी लगभग निश्चित रूप से एक बेहतर रिफैक्टरिंग है)। –

-1
  1. पायथन में सजावट सजावटी पैटर्न के समान नहीं है, सोचा कि कुछ समानता है। यह पूरी तरह से स्पष्ट नहीं है कि आपका मतलब है, लेकिन मुझे लगता है कि आपका मतलब पाइथन से है (इस प्रकार, शब्द पैटर्न का उपयोग न करना बेहतर है)

  2. पायथन से सजावट अपवाद हैंडलिंग के लिए उपयोगी नहीं हैं, क्योंकि आप सजावट करने के लिए कुछ संदर्भ पारित करने की आवश्यकता होगी। यही है, आप या तो वैश्विक संदर्भ पारित करेंगे, या कुछ बाहरी संदर्भ में फ़ंक्शन परिभाषाओं को छुपाएंगे, जिनकी आवश्यकता है, मैं कहूंगा, LISP- सोचने का तरीका।

  3. सजावटी के बजाय आप संदर्भ प्रबंधक का उपयोग कर सकते हैं। और मैं उस उद्देश्य के लिए उनका उपयोग करता हूं।

+2

संदर्भ प्रबंधक निश्चित रूप से उपयोगी हैं, लेकिन वे उन मामलों को संभाल नहीं पाते हैं जिनके बारे में ओपी बात कर रहा है: कार्य में किए बिना कार्यों के साथ अपवाद हैंडलिंग कोड होना चाहिए। –

+0

बिल्कुल! एथन ने इसे एक बार में दबाया। मैं संदर्भ दृष्टिकोण पर भी विचार कर रहा था, लेकिन सजावटी के साथ मेरे पास अनावश्यकता को हल करने का एक और अधिक सामान्य तरीका है। –

संबंधित मुद्दे