2013-12-12 9 views
5

मैं कुछ भाषा में लिखी गई स्क्रिप्ट को पार्स करने के लिए लूआ का उपयोग कर रहा हूं (चलिए इसे एल कहते हैं) और लुआ-कोड बनाएं जो कि उदाहरण के द्वारा चलाया जा सकता है। LuaJIT। लेकिन उपयोगकर्ताओं के लिए डिबगिंग को सरल बनाने के लिए, मैं एल-फाइलों में लूआ/लुआजिट द्वारा दी गई रन टाइम त्रुटियों को मैप करना चाहता हूं। मैं इसे बनाया हुआ लुआ-कोड xpcalling करके, त्रुटि संदेश और stacktrace का अनुवाद करके और फिर इस संदेश के साथ त्रुटि कॉल करके करता हूं। दुर्भाग्य से यह मुझे दो स्टैक निशान देता है, जो मेरे द्वारा बनाया गया है और एक फंक्शन पर वापस ट्रेसिंग करता है जिसे त्रुटि कहा जाता है। क्या इस स्टैक ट्रेस से छुटकारा पाना संभव है, या ऐसा करने का कोई बेहतर तरीका है?लुआ: स्टैक ट्रेस के बिना त्रुटि कैसे कॉल करें

local status, err = xpcall(loadedCode, debug.traceback) 
if not status then 
    error(createANewErrorMessageWithPrettyTraceback(err),0) 
end 

आउटपुट:

luajit: ./my/file.name:5: Some error message 
stack traceback: 
    my pretty traceback 
stack traceback: 
    [C]: in function 'error' 
    ./my/file/calling/error.lua:44: in function <./my/file/calling/error.lua:26> 
    ./my-main:16: in main chunk 
    [C]: at 0x00404180 

मुझे पता है कि जैसे Moonscript यह करने के लिए कुछ इसी तरह करता है, लेकिन जहाँ तक मैं देख सकते हैं वे सिर्फ stderr करने के लिए नए त्रुटि संदेश लिख सकते हैं और उसके बाद के रूप में सामान्य जारी है, बजाय कार्यक्रम को रोकने के है जो मैं करना चाहता हूँ की।
ऐसा करने की संभावना है और फिर कोई तर्क के साथ त्रुटि को कॉल कर रहा है, जो प्रोग्राम को असफल कर देगा (वास्तव में मुझे लगता है कि यह त्रुटि है जो विफल हो जाती है), लेकिन यह काफी बदसूरत समाधान की तरह लगता है, इसलिए मैं बेवकूफ रखूंगा ऐसा करने से दूसरा निशान।
पीएस: मुझे लगता है कि शीर्षक वास्तव में क्या काम नहीं करता है (क्योंकि त्रुटि केवल दो तर्क लेती है), इसलिए मैं वास्तव में जो पूछ रहा हूं वह यह है कि इस तरह कुछ कैसे हासिल किया जा सकता है। (वहाँ अन्य कार्यों है कि इसी तरह की बातों शायद कर रहे हैं, या जहाँ मैं यह पता लगाने कैसे है कि समारोह अपने आप को लिखने के लिए करने के लिए दिखना चाहिए।)
संपादित करें: यह शायद समारोह है कि त्रुटि के अपने ट्रैस बैक प्राप्त करने के लिए का उपयोग कर संपादित करने के लिए संभव है, के रूप में यह है debug.traceback के साथ?

+0

क्यों त्रुटि कॉल करने के बजाय ट्रेसबैक मुद्रित न करें? –

+0

क्योंकि मैं जब यह एक त्रुटि है कार्यक्रम विफल, बजाय सिर्फ उपयोगकर्ता है कि कुछ हुआ बताने का चाहते हैं। लेकिन जैसे-जैसे रयान स्टीन नीचे ने कहा, मैं तो बस os.exit कॉल कर सकते हैं। – MartinValen

उत्तर

2

आप बस संशोधित ट्रैस कि आप चाहते हैं और बाहर निकलने को प्रदर्शित कर सकता है।

local function errh(err) 
    print(createANewErrorMessageWithPrettyTraceback(debug.traceback(err, 2))) 
    os.exit(-1) -- error code 
end 

local status, result = xpcall(loadedCode, errh) 
-- The script will never reach this point if there is an error. 
print(result) 
3

मैं (सीधे केवल लुआ से) ऐसी ही कुछ करना चाहता था और मैं debug.traceback समारोह खुद को अधिलेखित मेरी आवश्यकताओं के अनुरूप स्टैक ट्रेस को बदलने के लिए समाप्त हो गया। मेरा कोड नीचे है; देखने के लिए इस विधि आप के लिए काम करता है, तो साथ ही साथ:

local dtraceback = debug.traceback 
    debug.traceback = function (...) 
    if select('#', ...) >= 1 then 
     local err, lvl = ... 
     if err and type(err) ~= 'thread' then 
     local trace = dtraceback(err, (lvl or 2)+1) 
     if genv.print == iobase.print then -- no remote redirect 
      return trace 
     else 
      genv.print(trace) -- report the error remotely 
      return -- don't report locally to avoid double reporting 
     end 
     end 
    end 
    -- direct call to debug.traceback: return the original. 
    -- debug.traceback(nil, level) doesn't work in Lua 5.1 
    -- (http://lua-users.org/lists/lua-l/2011-06/msg00574.html), so 
    -- simply remove first frame from the stack trace 
    return (dtraceback(...):gsub("(stack traceback:\n)[^\n]*\n", "%1")) 
    end 
संबंधित मुद्दे