2010-08-15 23 views
26

जावास्क्रिप्ट में मैं अपवाद की एक var str = ".a long string that contains many lines..." में ऐसा होता है कि द्वारा eval(str);जावास्क्रिप्ट eval() अपवाद - लाइन नंबर

मैं इसे पकड़ने और लाइन नंबर है कि अपवाद उत्पन्न प्रिंट करना चाहते था की वजह से है। (लाइन आंतरिक str के लिए ..)

क्या यह संभव है?

संपादित मगरमच्छ परियोजना (http://github.com/mrohad/Alligator), जावास्क्रिप्ट के लिए एक आवेदन सर्वर के हिस्से के रूप में, मैं डिस्क और eval() कुछ भी है कि एक scriplet को नीडिंत है से फाइल पढ़ रहा हूँ (<??>)

मैं नोडजेएस (वी 8 के शीर्ष पर) का उपयोग कर ब्राउज़र के बाहर इस स्क्रिप्ट को चला रहा हूं।

+2

सुनिश्चित नहीं हैं कि इस: d एक कोशिश {} {पकड़ अंदर यह आह्वान} और मैं स्टैक ट्रेस से त्रुटि लाइन ...

पार्स मेरी विशिष्ट मामले में, यह कैसे कोड की तरह लग रहा है मल्टी-लाइन कमांड को अलग-अलग निर्देशों और eval() कॉल में विभाजित किए बिना भी किया जा सकता है। –

+2

यह पहली जगह में "eval" का उपयोग करने के लिए बहुत बदसूरत है। शायद आप वर्णन कर सकते हैं कि आप क्या करने की कोशिश कर रहे हैं, और किसी के पास एक बेहतर विचार हो सकता है। – Pointy

+1

बहु लाइनों के लिए eval बंटवारे के साथ समस्या यह उदाहरण के लिए है, जब आपके पास अगर (cond) <- लाइन # 1 {कुछ कोड} <- लाइन # 2, लाइन 1 अपवाद फेंक देते हैं, क्योंकि यह लाइन # पर निर्भर करता है 2 – DuduAlul

उत्तर

3

मैं एक समाधान है जो बहुत अक्षम है पाया, फिर भी मैं केवल इसका इस्तेमाल जब debug_mode == 1 तो यह है कि बुरा नहीं है ..

मैं एक फाइल करने के लिए eval_str लिखते हैं, मैं "आयात कि फ़ाइल, एक

var errFileContent = "exports.run = "+evalStringAsAFunction+";"; 
fs.writeFile('/home/vadmin/Alligator/lib/debugging.js', errFileContent, function (err) { 
    var debug = require('./debugging'); 
    try{ 
     debug.run(args...); 
    } 
    catch(er){ 
     log.debug(parseg(er)); 
    } 
}); 
+1

यह एक अक्षम हैक है, लेकिन यह निश्चित रूप से एक कार्यवाही है जब तक कि Google V8 इस सुविधा का समर्थन नहीं करता है। अच्छा, thx। – BMiner

+0

अफसोस की बात है कि यह ब्राउज़र में काम नहीं करेगा ... – Domi

0

यह आपकी समस्या नहीं सुलझती?

try { 
    eval(str); 
} catch (e) { 
    console.log(e.lineNumber) 
} 
+1

मैं e.lineNumber के लिए अपरिभाषित कर रहा हूँ ... – DuduAlul

+2

@MrOhad, त्रुटि वस्तुओं पर 'lineNumber' संपत्ति है * गैर-मानक *, यह केवल मोज़िला कार्यान्वयन पर ही काम करेगा, लेकिन मुझे डर है कि यह आपको उस लाइन नंबर को वापस कर देगा जहां आपने 'eval' का आह्वान किया था, न कि मूल्यांकन किए गए पाठ के अंदर वास्तविक पंक्ति संख्या। – CMS

+1

फ़ायरफ़ॉक्स में काम करता है, लेकिन अन्य ब्राउज़रों में नहीं। क्रोम/आयरन में, आप 'e.stack' के अंत तक पंक्ति संख्या प्राप्त कर सकते हैं। –

3

1) रन:

 
var javascript_offset; 
try { 
    undefined_function(); 
} catch(ex1) { 
    javascript_offset = ex1.lineNumber; 
} 
try { 
    YOUR_STRING_WITH_JS 
} catch (ex2) { 
    var line_that_caused_it = ex2.lineNumber - javascript_offset -2; 
    HANDLE_THE_EXCEPTION_HERE 
} 
+0

मैं इस स्क्रिप्ट को ब्राउजर के बाहर चला रहा हूं, नोडजेएस (वी 8 के शीर्ष पर) – DuduAlul

6

कोशिश eval के आसपास के बजाय स्ट्रिंग के लिए ट्राई/कैच जोड़ने:

var code = 'try{\nvar c = thisFuncIsNotDefined();\n}catch(e){alert(e.lineNumber);}'; 
+0

का उपयोग करके मैंने सोचा कि यह मेरे समाधान से भी बेहतर है, लेकिन मैंने इसका परीक्षण किया है और यह काम नहीं करता है, वैसे ही जैसे स्टैक {} पकड़ { } eval – DuduAlul

+0

@AndreyKo से समाधान के साथ इस गठबंधन का हिस्सा नहीं था और आप एक समाधान है कि फ़ायरफ़ॉक्स – Michael

+0

में काम करेंगे यह एक सुंदर समाधान है, धन्यवाद स्टीव – sleepycal

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