2012-01-06 7 views
6

मेरे पास एक लुआ फ़ंक्शन है जो एकाधिक पैरामीटर लेता है और पैरामीटर के रूप में कई मान देता है। प्रत्येक वापसी मूल्य पैरामीटर से मेल खाता है। इसे समझने के लिए एक समारोह है जो एक डेटाबेस से एक मुख्य/मान जोड़े के लिए मूल्य पढ़ता है पर विचार करें:एकाधिक मूल्यों को लौटाने वाले लुआ फ़ंक्शन से त्रुटि लौटने के लिए सर्वोत्तम अभ्यास

val1, val2, val3 = my_function("key1", "key2", "key3"); 
val1 = my_function("key1"); 

my_function से एक त्रुटि वापस जाने के लिए सबसे अच्छा तरीका क्या है? (उदाहरण के लिए यदि एक आपूर्ति की गई "कुंजी" अमान्य है)

मैं समझता हूं कि एक तरफ त्रुटि पर दो मान वापस लौटना है, nil और एक त्रुटि स्ट्रिंग। क्या यह सबसे अच्छा तरीका है?

val1, val2, val3 = my_function("key1", "key2", "key3"); 
if val1 then 
    -- Use val1, val2, and val3. 
else 
    print("ERROR: " .. val2); 
end 

संपादित

कुछ अतिरिक्त बिंदु: उदाहरण के लिए:

  1. lua स्क्रिप्ट lua_pcall() का उपयोग कर एक सी कार्यक्रम के भीतर से मार डाला जा रहा है।
  2. स्क्रिप्ट विफल होने पर सी प्रोग्राम निरस्त नहीं होना चाहिए।
  3. my_function() सी
  4. में लागू किया जाता है तो my_function() में विफल रहता है, यह भी एक त्रुटि कोड (या संदेश) कारण यह विफल रहा है का संकेत देना चाहिए।

उत्तर

6

लुआ में त्रुटियों फेंकने की मानक तरीका त्रुटि समारोह (manual, api) (जो आंतरिक रूप से error वैसे भी उपयोग करता है) के माध्यम से या assert के माध्यम से है।

चूंकि आपका कार्य सी में है, इसलिए आपको उसी प्रभाव को प्राप्त करने के लिए lua_error पर कॉल करना चाहिए।

लेकिन ध्यान रखें कि आपका कार्य अब "असुरक्षित" है। कभी कभी यह कार्यक्रम "बस दुर्घटना जाने के लिए ठीक है

val1, val2, val3 = my_function("key1", "key2", "key3") 

: असंशोधित, तो निम्न कोड यदि कुंजी 1, कुंजी 2 या key3" गलत "कर रहे हैं" एक अपवाद फेंक "और इस तरह कार्यक्रम को रोकने, बराबर करना होगा "अगर इनपुट गलत हैं। आपके सेटअप के आधार पर, उपयोगकर्ता को अंतिम त्रुटि, और एक स्टैक ट्रेस, या उन पंक्तियों के साथ कुछ संदेश मिलेगा।

हैं "कार्यक्रम दुर्घटना दे" एक विकल्प नहीं है, तो आप pcall समारोह का उपयोग कर, और एक नया चर कहा ok जोड़कर एक "ट्राई-पकड़" ब्लॉक के साथ इसके आसपास के बराबर कर सकते हैं:

ok, val1, val2, val3 = pcall(my_function, "key1", "key2", "key3") 
if ok then 
    -- Use val1, val2, and val3. 
else 
    print("ERROR: " .. val1) -- notice that we use val1 here, not val2 
end 

ध्यान दें कि आपको pcall को my_function के शीर्ष पर बिल्कुल नहीं रखना है। अपवादों के साथ, कॉल श्रृंखला में त्रुटि पुनरावृत्ति अधिक हो सकती है: my_function पर कॉल करने वाले फ़ंक्शन में, या उस फ़ंक्शन को कॉल करना आदि।उदाहरण के लिए, यदि आप grandParent नामक एक समारोह parent कहा जाता है, और एक से माता पिता से my_function कहते हैं, आप यह कर सकते हैं:

-- parent is "insecure" since my_function is "unprotected" 
function parent(key1, key2) 
    local val1, val2, val3 = my_function(key1, key2, "key3") 
    return val1, val2, val3 
end 

-- grandParent calls parent in a "safe" way 
function grandParent() 
    local ok, val1, val2, val3 = pcall(parent, "key1", "key2") 
    if ok then 
    -- Use val1, val2, and val3. 
    else 
    print("ERROR: " .. val1) 
    end 
end 
+0

मैंने कुछ बिंदुओं को स्पष्ट करने के लिए प्रश्न संपादित किया है। चूंकि लुआ स्क्रिप्ट (जो अंततः 'my_function() 'को कॉल करती है, सी से' lua_pcall() 'के साथ चलायी जाती है, क्या आपके ऊपर वर्णित' my_function() 'एक" ठीक "चर होना चाहिए? (उदा। 'ठीक है, val1, val2, val3 = my_function() ')। – Ben

+0

@ बेन, हाँ, मैं एक अतिरिक्त 'ठीक' मान शामिल करूंगा - जो कि सबसे साफ तरीका प्रतीत होता है। मैं डिजाइन में संशोधन की भी सिफारिश करता हूं; चूंकि दोनों कार्य सी में हैं, इसलिए यह संभवतः लुआ के बारे में भूलने के लिए सरल (और तेज़) होने जा रहा है और सी – kikito

+0

@ किक्टो में बस सबकुछ कर रहा है, स्पष्टीकरण के लिए धन्यवाद। इस मामले में यह निश्चित रूप से उत्पाद को विस्तारित करने के लिए लुआ (या समकक्ष) का उपयोग करने के लिए समझ में आता है। – Ben

0

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

+0

यदि मैं my_function() को विफल होने के कारण को वापस लौटना चाहता हूं, तो क्या आप वकालत कर रहे हैं कि यदि 'val1, val2, val3 = my_function() 'विफल रहता है,' val1'' nil' होना चाहिए और 'val2' त्रुटि कोड होना चाहिए /संदेश? – Ben

+0

@ बेन, नहीं, मैंने सोचा कि एकमात्र कारण "अमान्य कुंजी" था। – lhf

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

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