2013-01-15 29 views
10

मैंने अपने आवेदन में अपवाद को संभालने के इस तरीके का पालन किया है। लेकिन मेरे नेतृत्व ने कहा कि मैं इसे गलत कर रहा हूं। मैं बस एक ही अपवाद को लपेट रहा हूं और फिर से प्रयास कर रहा हूं, जो प्रदर्शन को प्रभावित करेगा।क्या अपवाद प्रभाव प्रदर्शन को लपेटना और पुनर्स्थापित करना है?

मेरे दृष्टिकोण में क्या गलत है? क्या किसी के पास कोई सुझाव है कि मैं यहां अपवाद कैसे लॉग और संभाल सकता हूं?

public class BusinessRepository : IBusinessRepo 
{ 
    public List<Employee> GetEmployees() 
    { 
     try 
     { 
      //do some DB operations 
     } 
     catch (SQLException sqlex) 
     { 
      Logger.Log("Exception detail with full stack trace"); 
      throw new DALException(sqlex, "Error in data access layer"); 
     } 

    } 
} 
public class BusinessLayerClass : IBusinessLayer 
{ 
    private readonly IBusinessRepo Repo; 
    public BusinessLayerClass(IBusinessRepo rep) 
    { 
     Repo = rep; 
    } 
    public List<Employee> GetEmployees() 
    { 
     try 
     { 
      List<Employee> emps= return Repo.GetEmployees(); 
     } 
     catch (DALException dex) 
     { 
      //do nothin as it got already logged 
      throw; 
     } 
     catch (Exception ex) 
     { 
      Logger.Log(ex, "Business layer ex"); 
      throw new BusinessLayerEx(ex); 
     } 
    } 
} 

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     try 
     { 
      List <Employee>= BusinessLayerClass.GetEmployees(); 

     } 
     catch (DALException) 
     { 
      //show error msg to user 
     } 
     catch (BusinessLayerEx) 
     { 
      //show error msg to user 
     } 
     catch (Exception ex) 
     { 
      Logger.Log(); 
      //show error msg to user 
     } 
     return View(emps); 
    } 
} 

मैं ऊपर दिखाए गए उत्साह से भरा हुआ और हैंडलिंग और प्रवेश की सही तरीके से पालन करें?

+2

जॉन स्कीट प्रदर्शन के अनुसार अपवाद फेंकने से शायद ही कभी प्रभावित होता है। देखें: http://www.developerfusion.com/article/5250/exceptions-and-performance-in-net/ – albertjan

+2

चूंकि अपवाद असाधारण होना चाहिए, क्या इससे कोई फर्क पड़ता है? – emartel

+0

@albertjan मैं जॉन स्कीट पर सहमत हूं। लेकिन क्या मेरा दृष्टिकोण संभाल और लॉग करने का सही तरीका है? – Billa

उत्तर

3

मैं, ऐसा करने का अपना रास्ता साथ सहमत करने के रूप में लंबे समय के रूप में दो शर्तें पूरी की इच्छुक हूँ:

  1. आपका Logger.Log बयान आप यहाँ क्या इंगित किया है की तुलना में अधिक सार्थक कुछ/उपयोगी लॉग इन करें (मैं यहां अपना कोड अनुमान लगा रहा हूं यह एक नमूना संदेश है जो त्रुटि को इंगित करता है)। यदि यह जानकारी प्रदान करता है तो आप अपवाद के कारण को ट्रैक करने के लिए उपयोग कर सकते हैं, अच्छा।
  2. आपकी //show error msg to user टिप्पणियों का अर्थ है कि उस स्थान पर, आप एक अच्छा दृश्य प्रस्तुत करते हुए समझाते हैं कि एक त्रुटि हुई है, और आप केवल एक डिफ़ॉल्ट अपवाद स्क्रीन/स्टैक ट्रेस नहीं दिखा रहे हैं।

जब तक आप 0xतक डेलक्सप्शन को पकड़ते हैं तो आपने अभी फेंक दिया: यह ठीक है। ऐसा लगता है कि आपका लक्ष्य पिछली परत से बाहर आने वाले किसी अपवाद को पकड़ने और बाद में अपना अपवाद फेंकने के लिए लॉग इन करना प्रतीत होता है। चूंकि डेलक्सप्शन केवल तभी फेंक दिया जाएगा यदि आपने पहले से ही एक और त्रुटि लॉग कर दी है और इसे स्वयं फेंक दिया है, तो यह इस स्तर से पहले बुलबुला करने के लिए बिल्कुल ठीक है।

1

अपवादों के लिए अंगूठे का सामान्य नियम उन्हें तब तक नहीं पकड़ता जब तक कि आप "इसके बारे में कुछ नहीं कर सकते", यानी मूल्य जोड़ें। आदर्श रूप से यह इस बिंदु पर किसी प्रकार की सुंदर वसूली होगी कि उपयोगकर्ता कभी नहीं जानता कि वहां एक हिचकी थी, लेकिन कम से कम इसमें अपवाद लॉगिंग शामिल होगी - जो आप कर रहे हैं।

इसे तुरंत पुनः फेंकने के लिए अपवाद न पकड़ें। इससे कोई मूल्य नहीं बढ़ता है। (इसके लिए एक अपवाद हो सकता है यदि आपको संदर्भ के लिए अधिक जानकारीपूर्ण/उपयुक्त कुछ अपवाद के प्रकार को बदलने की आवश्यकता है)।

+0

वह कुछ अपवाद कर रहा है (या तो इसे म्यूट कर रहा है या लॉगिंग जानकारी) और * फिर * इसे फिर से फेंक रहा है, वह कुछ भी करने के लिए इसे पकड़ नहीं रहा है, लेकिन एक ही अपवाद को फिर से फेंक रहा है, इसलिए यह लागू नहीं होता है। – Servy

+0

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

+0

@ सर्वी नो, वह इसे पकड़ रहा था और सचमुच इसे फिर से फेंकने के अलावा कुछ भी नहीं कर रहा था। उन्होंने दोनों में यह भी टिप्पणी की कि वह जानबूझकर कुछ भी नहीं करता है और क्यों - "यह पहले ही लॉग है"। –

1

किसी भी सामान्य रिटर्न तंत्र की तुलना में अपवादों को फेंकना और पकड़ना महंगा है, लेकिन यह बिंदु के अलावा एक प्रकार है - हमें अपवादों का उपयोग सामान्य नियंत्रण-प्रवाह तंत्र के रूप में नहीं करना चाहिए, बल्कि असाधारण चीजों को संभालने के लिए किया जाना चाहिए।

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

मैं कहूंगा कि आपका नेतृत्व कहता है कि "यह गलत है" तो यह पूछना उचित है कि "हमारी त्रुटि-प्रबंधन रणनीति क्या है?"। यदि आपको यह भी पता नहीं है कि आपका कोड किस उद्देश्य को पूरा करना है, तो आप संभवतः महान कोड कैसे दे सकते हैं?

0

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

प्रदर्शन के लिए, यह वास्तव में कोई फर्क नहीं पड़ता क्योंकि कुछ बहुत बुरा पहले से ही हुआ है।

+0

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

+1

अपवाद और प्रदर्शन (http://www.developerfusion.com/article/5250/exceptions-and-performance-in-net/) को बेहतर ढंग से समझने के लिए आप जॉन स्कीट द्वारा पहली टिप्पणी में लिंक पढ़ सकते हैं। मेरी राय यह है कि ज्यादातर अनुप्रयोगों के लिए आपको अपवादों को इस तरह से संभालना चाहिए जो एप्लिकेशन के लिए समझ में आता है और प्रदर्शन के बारे में चिंता न करें। –

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

  • कोई संबंधित समस्या नहीं^_^