2011-09-21 16 views
12

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

मुझे इन त्रुटियों को कैप्चर करने या अन्यथा अंतर करने का एक तरीका है। मैं पहले से ही की कोशिश की है:

  • एक कोशिश पकड़
    • परिणाम में मेरी PhantomJS स्क्रिप्ट रैपिंग: कुछ भी नहीं काफी दूर तक फेंक दिया जाता है इस
  • द्वारा पकड़ा जा करने के लिए एक window.onerror समारोह
    • को परिभाषित करें परिणाम: कुछ भी नहीं होता है। वेबकिट खिड़की

मैं त्रुटि वस्तु ही पुनः प्राप्त करने के लिए इतना है कि मैं स्टैकट्रेस प्राप्त कर सकते हैं सक्षम होने के लिए पसंद करेंगे पर एक onerror घटना को लागू नहीं करता है।

+0

मुझे लगता है कि आप 'window.onerror' फ़ंक्शन को परिभाषित करना चाहते हैं, है ना? –

+0

यूप, तय। धन्यवाद! –

उत्तर

8

मुझे लगता है कि window.onerror के साथ समस्याएं थीं जो वेबकिट (https://bugs.webkit.org/show_bug.cgi?id=8519) में ठीक से काम नहीं कर रही थीं। यह नहीं पता कि यह बिल्कुल तय किया गया है, और यदि ऐसा है, तो क्यूटी वेबकिट संस्करण पहले से ही अद्यतित है।

हालांकि, आपको अपने कोड में दिए गए अपवादों को पकड़ने में सक्षम होना चाहिए। यदि आप अपना कोड चलाने के लिए webPage.evaluate(...) जैसे कुछ उपयोग कर रहे हैं, तो आप एक पूर्ण संदर्भ में स्क्रिप्ट का मूल्यांकन करने के बाद से पूरी कॉल को एक कोशिश/पकड़ ब्लॉक में लपेट नहीं सकते हैं और त्रुटियां मुख्य निष्पादन संदर्भ में प्रकट नहीं होंगी। इसके बजाय आपको पेज निष्पादन संदर्भ में त्रुटियों को पकड़ने की आवश्यकता होगी। दुर्भाग्यवश, मुख्य संदर्भ में परिभाषित किसी भी फ़ंक्शन तक पहुंचने का कोई तरीका नहीं है, इसलिए हमें निष्पादित होने के लिए आपके कोड के चारों ओर रैपिंग कोड स्पष्ट रूप से लिखना होगा।

निम्नलिखित phantomwebintro.js फ़ाइल का एक संशोधित उदाहरण है जो फ़ैंटॉमजेएस स्रोत में शामिल है। यह एक HTML पृष्ठ लोड करता है, एक स्क्रिप्ट सम्मिलित करता है और फिर पृष्ठ संदर्भ में कुछ कोड चलाता है (यहां एक प्रकार की त्रुटि फेंकने वाली रेखा के साथ)। यह कोड एक कोशिश/पकड़ ब्लॉक के साथ लपेटा गया है और मुख्य संदर्भ में लपेटा परिणाम या त्रुटि वस्तु वापस कर देगा।

... 

// Load an HTML page: 
page.open("http://www.phantomjs.org", function(status) { 
    if (status == "success") { 

     // Inject some scripts: 
     page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() { 

      // Run your own code in the loaded page context: 
      var resultWrapper = page.evaluate(function() { 
       var wrapper = {}; 
       try { 
        // Your code goes here 
        // ... 

        var x = undefined.x; // force an error 

        // store your return values in the wrapper 
        wrapper.result = 42; 
       } catch(error) { 
        wrapper.error = error; 
       } 
       return wrapper; 
      }); 

      // Handle the result and possible errors: 
      if (resultWrapper.error) { 
       var error = resultWrapper.error; 
       console.log("An error occurred: " + error.message); 
       // continue handling the error 
       // ... 
      } else { 
       var result = resultWrapper.result; 
       // continue using the returned result 
       // ... 
      } 

      ... 

     }); 
    } 
}); 

... 
+0

यह एक अच्छा समाधान होगा सिवाय इसके कि कोड जो मैं फैंटॉमजेएस में चलाने का प्रयास कर रहा हूं वह असीमित है। हालांकि, मेरा मानना ​​है कि नवीनतम संस्करण QtWebKit के साथ फ़ैंटॉमजेएस का नवीनतम संस्करण विंडो को अनुमति देकर इस समस्या को हल करता है। आतंक। –

2

समाधान? return true!

 // Error tracking 
     page.onError = function(msg, trace) { 
      console.log('= onError()'); 
      var msgStack = [' ERROR: ' + msg]; 
      if (trace) { 
      msgStack.push(' TRACE:'); 
      trace.forEach(function(t) { 
       msgStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function + '")' : '')); 
      }); 
      } 
      console.log(msgStack.join('\n')); 

      // Consider error fully handled 
      return true; 
     }; 
संबंधित मुद्दे