2009-12-18 20 views
5

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

3-पक्ष क्लाइंट को केवल कुछ sprocs के लिए, सीधे मेज पर नहीं पहुंच पाएंगे। स्पॉक्स द्वारा छुपाई गई तालिका अच्छी तरह से बाधित है, लेकिन जब तक स्पॉक्स गलत तरीके से बुलाए जाते हैं, तब तक हम विस्तृत त्रुटि जानकारी प्रदान करते हुए उपयोगकर्ता के अनुकूल के रूप में बनना चाहते हैं।

+1

महान सवाल! –

उत्तर

2

सूचनात्मक त्रुटि संदेश प्रदान करना मुश्किल नहीं है जो मनुष्य समझ सकता है। एक वर्णनात्मक पाठ के साथ बस RAISERROR। स्थानीय ग्रंथों को बढ़ाने के लिए थोड़ा और मुश्किल है, जो sp_addmessage और परिवार के उचित उपयोग का तात्पर्य है। असली हार्ड समस्या उस त्रुटि को बढ़ा रही है जिसमें एक प्रोग्राम प्रतिक्रिया दे सकता है। यह ठीक से उन्हें अपने एपीआई में उपयोग करने में त्रुटि कोड (और गंभीरता और राज्य), और गंभीर कोड अनुशासन दस्तावेज का मतलब है।

और उचित लेन-देन नेस्टिंग मत भूलना। मेरे पास इस ब्लॉग पर एक नमूना है कि टी-एसक्यूएल अपवादों के साथ संयोजन में लेनदेन को सही ढंग से कैसे संभालना है: Exception handling and nested transactions

दुर्भाग्य से पूरे ग्राहक/T-SQL ढेर की तुलना में एक की तुलना में अपवाद पर कला के राज्य में कुछ समस्याएं हैं। सबसे उल्लेखनीय यह है कि यदि आप टी-एसक्यूएल अपवाद पकड़ते हैं, तो आप इसे फिर से नहीं हटा सकते हैं, इसलिए आपका ग्राहक सामान्य सिस्टम त्रुटि संख्या की अपेक्षा नहीं कर सकता है। SQL सर्वर देखें: Rethrow exception with the original exception number। यह 50000 से अधिक रेंज है, जो 'transalated' त्रुटि कोड की संख्या बढ़ जाती है, और अपवाद जानकारी के रूप में त्रुटि संदेश स्ट्रिंग का उपयोग के रूप में बहुत बोझिल है पर अपने खुद के त्रुटि संख्या का उपयोग करने से उचित त्रुटि जानकारी संवाद करने के लिए, अन्य छोटे साधन के साथ छोड़ देता है ।

+0

क्या गैर-विंडोज क्लाइंट्स के साथ कोई इंटरऑपरेबिलिटी समस्या है, उदाहरण के लिए * फ्री क्लासेस का उपयोग कर निक्स क्लाइंट? अपने दस्तावेज़ों में रेसियरर हैंडलिंग का उल्लेख उल्लेख है। –

+0

ऐसा नहीं है कि मैं किसी के बारे में जानता हूं। RAISERROR सिस्टम त्रुटियों के रूप में एक ही तरह की त्रुटि उठाता है, और फ्रीटीडीएस जानता है कि उनको कैसे संभालना है। –

3
  • उपयोग ट्राई/कैच ब्लॉक
  • फेंक सार्थक संदेश (मैं इस तरह के रूप में एक उपसर्ग का उपयोग "जानकारी:" डेटाबेस त्रुटियों से मेरी त्रुटियों भेद करने के लिए)

उदाहरण:

SET NOCOUNT, XACT_ABORT ON 
... 
BEGIN TRY 
    IF @parameter1 IS NULL 
     RAISERROR ('INFO: "parameter1" should not be blank', 16, 1) 

    IF @parameter2 < 0 
     RAISERROR ('INFO: "parameter2" must be greate then zero', 16, 1) 

    ... 

END TRY 
BEGIN CATCH 
    DECLARE @MyError nvarchar(2048) 
    SELECT @MyError = ERROR_MESSAGE() -- + other stuff, like stored proc name perhaps 
    RAISERROR (@MyError, 16, 1) 
    ... 
END CATCH 
+1

आप एक अलग राज्य प्रत्येक RAISERROR बनाना चाहिए: (..., 16, ** 1 **), (..., 16, ** 2 **), (..., 16, ** 3 **)। इस तरह जब कोई ग्राहक समर्थन करता है और एक त्रुटि जानकारी (संदेश, कोड, गंभीरता, राज्य) देता है तो समर्थन जल्दी से पता लगा सकता है कि किस स्थान ने त्रुटि उठाई है, जो वास्तव में राज्य का उद्देश्य है। –

+0

हम इसे थोड़ा सा जटिल करते हैं, जिसमें प्रत्येक त्रुटि लॉगिंग और ERROOR को INFO से अलग करना शामिल है। लॉगिंग ऑब्जेक्ट, त्रुटि ऑब्जेक्ट, लाइन नंबर इत्यादि। लेकिन: हम "ओप्स, डुप्लिकेट वैल्यू" से वास्तविक त्रुटियों को अलग करते हैं जो कि सूचनात्मक हैं और वास्तव में त्रुटियां नहीं हैं – gbn

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