क्या मुझे जांचना चाहिए कि क्या डीबी में कुछ मौजूद है या तेजी से विफल हो रहा है या डीबी अपवाद का इंतजार कर रहा है


32

दो वर्ग होने:

public class Parent 
{
    public int Id { get; set; }
    public int ChildId { get; set; }
}

public class Child { ... }

जब बताए ChildIdकरने के लिए Parentमैं पहले की जाँच करनी चाहिए अगर यह DB में मौजूद है या इंतजार डीबी एक अपवाद फेंकने के लिए के लिए?

उदाहरण के लिए (एंटिटी फ्रेमवर्क कोर का उपयोग करके):

ध्यान दें कि इस प्रकार के चेक आधिकारिक Microsoft डॉक्स पर भी सभी इंटरनेट पर हैं: https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using- mvc / handle-concurrency-with-the-unit-the-Framework-in-a-asp-net-mvc-application # संशोधित-दर-विभाग-नियंत्रक लेकिन इसके लिए अतिरिक्त अपवाद हैंडलिंग हैSaveChanges

यह भी ध्यान दें, इस चेक का मुख्य उद्देश्य एपीआई के उपयोगकर्ता के लिए अनुकूल संदेश और ज्ञात एचटीटीपी स्थिति को वापस करना था और डेटाबेस आयनों को पूरी तरह से अनदेखा नहीं करना था। और एक ही जगह के अपवाद को फेंक दिया जाना चाहिए अंदर SaveChangesया SaveChangesAsyncकॉल ... इसलिए जब आप कॉल करते हैं FindAsyncया कोई अपवाद नहीं होगा Any। इसलिए यदि बच्चा मौजूद है, लेकिन इससे पहले हटा दिया गया था, SaveChangesAsyncतो संगामिति अपवाद को फेंक दिया जाएगा।

मैंने ऐसा इस तथ्य के कारण किया है कि foreign key violation"आईडी के साथ बच्चे को प्रदर्शित करने के लिए प्रारूपण के लिए अपवाद बहुत कठिन होगा।

public async Task<ActionResult<Parent>> CreateParent(Parent parent)
{
    // is this code redundant?
   // NOTE: its probably better to use Any isntead of FindAsync because FindAsync selects *, and Any selects 1
    var child = await _db.Children.FindAsync(parent.ChildId);
    if (child == null)
       return NotFound($"Child with id {parent.ChildId} could not be found.");

    _db.Parents.Add(parent);    
    await _db.SaveChangesAsync();        

    return parent;
}

बनाम:

public async Task<ActionResult<Parent>> CreateParent(Parent parent)
{
    _db.Parents.Add(parent);
    await _db.SaveChangesAsync();  // handle exception somewhere globally when child with the specified id doesn't exist...  

    return parent;
}

Postgres में दूसरा उदाहरण 23503 foreign_key_violationत्रुटि फेंक देगा : https://www.postgresql.org/docs/9.4/static/errcodes-appendix.html

ईआरएम की तरह ओआरएम में अपवादों को संभालने का नकारात्मक पक्ष यह है कि यह केवल एक विशिष्ट डेटाबेस बैकएंड के साथ काम करेगा। यदि आप कभी SQL सर्वर या कुछ और पर स्विच करना चाहते हैं तो यह अब काम नहीं करेगा क्योंकि त्रुटि कोड बदल जाएगा।

एंड-यूज़र के लिए अपवाद को ठीक से फ़ॉर्मेट नहीं करना कुछ ऐसी चीज़ों को उजागर कर सकता है जिन्हें आप नहीं चाहते हैं लेकिन डेवलपर्स देखना चाहते हैं।

सम्बंधित:

https://stackoverflow.com/questions/6171588/preventing-race-condition-of-if-exists-update-else-insert-in-entity-framework

https://stackoverflow.com/questions/4189954/implementing-if-not-exists-insert-using-entity-framework-without-race-conditions

https://stackoverflow.com/questions/308905/should-there-be-a-transaction-for-read-queries


2
अपने शोध को साझा करना हर किसी की मदद करता है । हमें बताएं कि आपने क्या प्रयास किया है और यह आपकी आवश्यकताओं को पूरा क्यों नहीं करता है। यह दर्शाता है कि आपने खुद को मदद करने का प्रयास करने के लिए समय लिया है, यह हमें स्पष्ट उत्तरों को दोहराने से बचाता है, और सबसे अधिक यह आपको अधिक विशिष्ट और प्रासंगिक उत्तर प्राप्त करने में मदद करता है। यह भी देखें कैसे पूछें
gnat

5
जैसा कि दूसरों ने उल्लेख किया है, इस बात की संभावना है कि नोटफ़ाउंड के लिए आपकी जाँच के साथ एक रिकॉर्ड सम्मिलित या हटाया जा सकता है। उस कारण से, जाँच पहले एक अस्वीकार्य समाधान की तरह लगता है। यदि आप पोस्टग्रेज-विशिष्ट अपवाद हैंडलिंग के बारे में चिंतित हैं, जो अन्य डेटाबेस बैकेंड के लिए पोर्टेबल नहीं है, तो अपवाद हैंडलर को इस तरह से संरचना करने का प्रयास करें ताकि डेटाबेस-विशिष्ट वर्गों (एसक्यूएल, पोस्टग्रेज, आदि) द्वारा कोर कार्यक्षमता को बढ़ाया जा सके
बिलहार्ड्स

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

1
@Konrad को इसके साथ क्या करना है? दौड़ की स्थितियों के बारे में सोचना बंद करें जो आपके कोड में रहती है: यह ब्रह्मांड की एक संपत्ति है। कुछ भी, कुछ भी जो एक संसाधन को छूता है वह पूरी तरह से नियंत्रित नहीं करता है (जैसे प्रत्यक्ष मेमोरी एक्सेस, साझा मेमोरी, डेटाबेस, REST एपीआई, फाइल सिस्टम, आदि) एक से अधिक बार और यह अपरिवर्तित होने की उम्मीद करता है कि एक संभावित दौड़ की स्थिति है। ओह, हम सी में इस जो भी नहीं है के साथ सौदा किया है अपवाद नहीं। यदि संसाधन कम से कम एक शाखा उस संसाधन की स्थिति के साथ खिलवाड़ नहीं करता है तो बस कभी भी उस संसाधन की स्थिति पर नियंत्रण न करें, जिसे आप नियंत्रित नहीं करते हैं।
जेरेड स्मिथ

1
@DanielPryden मेरे प्रश्न में, मैंने यह नहीं कहा कि मैं डेटाबेस अपवादों को नहीं संभालना चाहता (मुझे पता है कि अपवाद अनिवार्य हैं)। मुझे लगता है कि बहुत से लोग गलत समझ रहे थे, मैं अपने वेब एपीआई (पढ़ने के लिए अंत उपयोगकर्ताओं) के लिए अनुकूल त्रुटि संदेश रखना चाहता था Child with id {parent.ChildId} could not be found.। और "विदेशी कुंजी उल्लंघन" का प्रारूपण मुझे लगता है कि इस मामले में और भी बुरा है।
कोनराड

जवाबों:


3

बल्कि एक उलझन भरा सवाल है, लेकिन हाँ आपको पहले जाँच करनी चाहिए न कि केवल एक डीबी अपवाद को संभालना चाहिए।

सबसे पहले, अपने उदाहरण में आप डेटा लेयर पर हैं, SQL चलाने के लिए डेटाबेस पर सीधे EF का उपयोग करते हैं। आप कोड चलाने के बराबर हैं

select * from children where id = x
//if no results, perform logic
insert into parents (blah)

आप जो विकल्प सुझा रहे हैं, वह है:

insert into parents (blah)
//if exception, perform logic

सशर्त तर्क को निष्पादित करने के लिए अपवाद का उपयोग धीमी और सार्वभौमिक रूप से पर आधारित है।

आपके पास एक दौड़ की स्थिति है और एक लेनदेन का उपयोग करना चाहिए। लेकिन यह पूरी तरह से कोड में किया जा सकता है।

using (var transaction = new TransactionScope())
{
    var child = await _db.Children.FindAsync(parent.ChildId);
    if (child == null) 
    {
       return NotFound($"Child with id {parent.ChildId} could not be found.");
    }

    _db.Parents.Add(parent);    
    await _db.SaveChangesAsync();        
    transaction.Complete();

    return parent;
}

मुख्य बात यह है कि अपने आप से पूछें:

"क्या आप इस स्थिति के होने की उम्मीद करते हैं?"

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

यदि आप इसे होने की उम्मीद करते हैं, तो यह असाधारण नहीं है और आपको यह देखने के लिए जांचना चाहिए कि क्या बच्चा पहले मौजूद है, अगर यह नहीं है तो उपयुक्त मैसेज के साथ जवाब देना चाहिए।

संपादित करें - ऐसा लगता है कि इस पर बहुत विवाद है। इससे पहले कि आप पर विचार करें:

A. अगर दो FK बाधाएं थीं तो क्या होगा। क्या आप इस अपवाद संदेश को पार्स करने की वकालत करेंगे कि कौन सी वस्तु गायब है?

B. यदि आपके पास एक मिस है, तो केवल एक एसक्यूएल स्टेटमेंट चलाया जाता है। यह केवल हिट है जो एक दूसरे प्रश्न का अतिरिक्त खर्च उठाता है।

सी। आमतौर पर आईडी एक सरोगेट कुंजी होगी, ऐसी स्थिति की कल्पना करना कठिन है जहां आप एक को जानते हैं और आपको यकीन नहीं है कि यह डीबी पर है। जाँच अजीब होगी। लेकिन क्या होगा अगर इसकी एक प्राकृतिक कुंजी उपयोगकर्ता ने टाइप की है? मौजूद नहीं होने का एक उच्च मौका हो सकता है


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
maple_shaft

1
यह पूरी तरह से गलत और भ्रामक है! यह इस तरह के उत्तर है जो बुरे पेशेवरों का उत्पादन करते हैं जिन्हें मुझे हमेशा से लड़ना पड़ता है। SELECT कभी भी टेबल को लॉक नहीं करता है, इसलिए SELECT और INSERT, UPDATE या DELTE के बीच, रिकॉर्ड बदल सकता है। तो यह घटिया घटिया सॉफ्टवेयर डिग्न है और उत्पादन में होने वाली दुर्घटना का इंतजार है।
डैनियल लोबो

1
@ डैनियललोबो लेन-देन ठीक करता है कि
इवान

1
यदि आप मुझ पर विश्वास नहीं करते हैं तो इसका परीक्षण करें
इवान

1
@ युषा मेरे पास कोड यहाँ है
इवान

111

विशिष्टता के लिए जाँच करना और फिर सेटिंग करना एक एंटीपैटर्न है; यह हमेशा हो सकता है कि आईडी समय और लेखन समय की जांच के बीच समवर्ती रूप से डाला गया हो। डेटाबेस इस समस्या से निपटने के लिए बाधाओं और लेनदेन जैसे तंत्र से लैस हैं; अधिकांश प्रोग्रामिंग भाषाएं नहीं हैं। इसलिए, यदि आप डेटा संगति को महत्व देते हैं, तो इसे विशेषज्ञ (डेटाबेस) पर छोड़ दें, अर्थात सम्मिलित करें और यदि ऐसा होता है तो एक अपवाद को पकड़ लें।


34
जाँच और असफलता केवल "कोशिश" और सर्वश्रेष्ठ के लिए आशा से तेज नहीं है। पूर्व का तात्पर्य है कि आपके सिस्टम द्वारा 2 क्रियान्वयन और प्रदर्शन 2 और DB द्वारा किया जाता है, जबकि नवीनतम केवल उनमें से एक का अर्थ है। जाँच डीबी सर्वर को सौंपी जाती है। यह भी नेटवर्क में एक कम हॉप और DB द्वारा भाग लेने के लिए एक कम काम का तात्पर्य है। हम सोच सकते हैं कि DB के लिए एक और क्वेरी सस्ती है, लेकिन हम अक्सर बड़े में सोचना भूल जाते हैं। उच्च संगामिति में एक सौ से अधिक बार क्वेरी को ट्रिगर करने के बारे में सोचें। यह पूरे ट्रैफ़िक को डीबी तक डुबो सकता है। अगर वह बात तय करना आपके ऊपर है।
Laiv

6
@Konrad मेरी स्थिति यह है कि डिफ़ॉल्ट-सही विकल्प एक क्वेरी है जो अपने आप विफल हो जाएगी, और यह अलग - अलग क्वेरी प्री-फ्लाइंग दृष्टिकोण है जिसमें स्वयं को औचित्य देने के लिए सबूत का बोझ है। जैसा कि "एक समस्या बन गई": इसलिए आप लेनदेन का उपयोग कर रहे हैं या अन्यथा यह सुनिश्चित कर रहे हैं कि आप ToCToU त्रुटियों के खिलाफ सुरक्षित हैं , है ना? मेरे द्वारा पोस्ट किए गए कोड से यह स्पष्ट नहीं है कि आप हैं, लेकिन यदि आप नहीं हैं, तो यह पहले से ही एक समस्या बन गई है जिस तरह से टिक टिक बम वास्तव में विस्फोट होने से बहुत पहले एक समस्या बन जाती है।
mtraceur

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

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

5
विशिष्टता के लिए जाँच पहले संभव विफलताओं को संभालने की आवश्यकता को समाप्त नहीं करती है। दूसरी ओर, अगर किसी कार्रवाई के लिए कई ऑपरेशन करने की आवश्यकता होती है, तो यह जाँचना कि क्या उनमें से किसी को शुरू करने से पहले सफल होने की संभावना है, अक्सर उन कार्यों को करने से बेहतर है जिन्हें संभवतः वापस करने की आवश्यकता हो। प्रारंभिक जाँच करने से उन सभी स्थितियों से बचा नहीं जा सकता है जहाँ एक रोलबैक आवश्यक होगा, लेकिन यह ऐसे मामलों की आवृत्ति को कम करने में मदद कर सकता है।
सुपरकाट

38

मुझे लगता है कि जिसे आप "फास्ट फेल" कहते हैं और जिसे मैं कहता हूं वह समान नहीं है।

डेटाबेस में बदलाव करने और विफलता को संभालने के लिए कह रहा है, जो कि तेज है। आपका रास्ता जटिल, धीमा और विशेष रूप से विश्वसनीय नहीं है।

आपकी यह तकनीक तेजी से विफल नहीं हुई है, यह "पूर्व-ज्ञान" है। कभी-कभी अच्छे कारण होते हैं, लेकिन तब नहीं जब आप डेटाबेस का उपयोग करते हैं।


1
ऐसे मामले हैं जब आपको 2 क्वेरी की आवश्यकता होती है जब एक वर्ग दूसरे पर निर्भर होता है, इसलिए आपके पास इस तरह के मामलों में कोई विकल्प नहीं है।
कोनराड

4
लेकिन यहाँ नहीं। और डेटाबेस क्वेरी काफी चतुर हो सकती है, इसलिए मैं आमतौर पर "कोई विकल्प नहीं" पर संदेह करता हूं।
gnasher729

1
मुझे लगता है कि यह एप्लिकेशन पर भी निर्भर करता है, यदि आप इसे केवल कुछ उपयोगकर्ताओं के लिए बनाते हैं तो इससे कोई फर्क नहीं पड़ना चाहिए और कोड 2 प्रश्नों से अधिक पठनीय है।
कोनराड

21
आप मान रहे हैं कि आपका DB असंगत डेटा संग्रहीत कर रहा है। दूसरे शब्दों में, ऐसा लगता है कि आपको अपने DB और डेटा की स्थिरता पर भरोसा नहीं है। अगर ऐसा था, तो आपको वास्तव में बड़ी समस्या है और आपका समाधान एक चलना है। एक उपशामक समाधान को बाद में जल्द ही समाप्त कर दिया गया। ऐसे मामले हो सकते हैं जब आप अपने नियंत्रण और प्रबंधन से बाहर एक DB का उपभोग करने के लिए मजबूर होते हैं। अन्य अनुप्रयोगों से। उन मामलों में, मैं इस तरह के सत्यापन पर विचार करूंगा। किसी भी मामले में, @gnasher सही है, तुम्हारा तेजी से असफल नहीं हो रहा है या यह नहीं है कि हम क्या तेजी से विफल के रूप में समझते हैं।
Laiv

15

यह एक टिप्पणी के रूप में शुरू हुआ लेकिन बहुत बड़ा हो गया।

नहीं, जैसा कि अन्य उत्तरों में कहा गया है, इस पैटर्न का उपयोग नहीं किया जाना चाहिए। "

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

आपको वैसे भी त्रुटि से निपटने की आवश्यकता है।

टिप्पणियों में आपने पूछा है कि अगर आपको कई स्रोतों से डेटा की आवश्यकता है।
अभी भी नहीं।

मौलिक मुद्दा दूर जाना नहीं पड़ता कि आप चेक करना चाहते हैं और अधिक जटिल हो जाता है।

फिर भी आपको वैसे भी त्रुटि से निपटने की आवश्यकता है।

यहां तक ​​कि अगर यह चेक उस विशेष त्रुटि को रोकने के लिए एक विश्वसनीय तरीका था जिसे आप के खिलाफ गार्ड करने की कोशिश कर रहे हैं, अन्य त्रुटियां अभी भी हो सकती हैं। यदि आप डेटाबेस से कनेक्शन खो देते हैं, या यह अंतरिक्ष से बाहर चला जाता है, या क्या होता है?

तुम शायद अभी भी वैसे भी अन्य डेटाबेस से संबंधित त्रुटि से निपटने की जरूरत है। इस विशेष त्रुटि से निपटने के लिए संभवतः इसका एक छोटा टुकड़ा होना चाहिए।

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

फिर भी आपको वैसे भी त्रुटि से निपटने की आवश्यकता है।

मुझे पता है कि मैं दोहराव कर रहा हूं लेकिन मुझे लगता है कि यह स्पष्ट करना महत्वपूर्ण है। मैंने पहले इस गंदगी को साफ किया है।

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

* इन मौजूद चेक को करने के लिए वैध व्यावसायिक कारण हो सकते हैं, जैसे कि एप्लिकेशन को महंगा काम करने से रोकने के लिए, लेकिन यह उचित त्रुटि से निपटने के लिए उपयुक्त प्रतिस्थापन नहीं है।


2

मुझे लगता है कि यहां ध्यान देने योग्य बात है - एक कारण जो आप चाहते हैं, वह यह है कि आप उपयोगकर्ता के लिए एक त्रुटि संदेश देख सकें।

मैं दिल से सिफारिश करूंगा कि आप:

a) अंतिम उपयोगकर्ता को प्रत्येक त्रुटि के लिए एक ही सामान्य त्रुटि संदेश दिखाता है।

ख) वास्तविक अपवाद को कहीं लॉग करें, जो केवल डेवलपर्स (यदि किसी सर्वर पर) का उपयोग कर सकता है या कहीं और जो आपको त्रुटि रिपोर्टिंग टूल (यदि क्लाइंट तैनात किया गया है) द्वारा भेजा जा सकता है।

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


संक्षेप में - अपवाद बहुत उपयोगी तकनीकी जानकारी से भरे हुए हैं। इसमें से कोई भी अंतिम उपयोगकर्ता के लिए नहीं होना चाहिए और आप इस जानकारी को अपने जोखिम में खो देते हैं।


2
"अंतिम उपयोगकर्ता को प्रत्येक त्रुटि के लिए एक ही सामान्य त्रुटि संदेश दिखाता है।" यह मुख्य कारण था, एंड-यूज़र के लिए अपवाद स्वरूपण करना एक भयानक बात की तरह लगता है ..
कोनराड

1
किसी भी उचित डेटाबेस सिस्टम में, आपको प्रोग्रामेटिकली यह पता लगाने में सक्षम होना चाहिए कि कुछ विफल क्यों हुआ है। अपवाद संदेश को पार्स करना आवश्यक नहीं होना चाहिए। और आम तौर पर: कौन कहता है कि उपयोगकर्ता को एक त्रुटि संदेश प्रदर्शित करने की आवश्यकता है? जब तक आप सफल नहीं हो जाते (या कुछ समय के लिए सीमा या समय तक) आप पहले सम्मिलित और फिर से प्रयास कर सकते हैं। और वास्तव में, बैकऑफ़-एंड-रिट्री एक ऐसी चीज़ है जिसे आप अंततः वैसे भी लागू करना चाहते हैं।
डैनियल प्रीडन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.