জাভাস্ক্রিপ্ট গ্লোবাল ইভেন্ট মেকানিজম


350

আমি নিক্ষিপ্ত প্রতিটি অপরিশোধিত ফাংশন ত্রুটি ধরতে চাই। জাভাস্ক্রিপ্টে কোনও বিশ্বব্যাপী ত্রুটি পরিচালনার সুবিধা আছে কি? ব্যবহারের ক্ষেত্রে ফ্ল্যাশ থেকে ফাংশন কলগুলি ধরা হচ্ছে যা সংজ্ঞায়িত নয়।


একবার ত্রুটিটি ধরা পরে আপনি কী করতে চান? আপনার কি কেবল এটি লগ করতে হবে যাতে আপনি অনুপস্থিত ফাংশনটি তৈরি করতে পারেন, বা আপনি কি আপনার কোডটি ভঙ্গ করতে ব্যতিক্রমগুলি থামানোর জন্য সন্ধান করছেন?
ড্যান হারবার্ট

2
আমি অনুপস্থিত ফাংশনটির নামটি কল করতে এবং কিছু স্ট্রিংয়ের উপস্থিতির ভিত্তিতে আমার নিজের ফাংশনটি পেতে চাই। 'ক্লোজিং' স্ট্রিং সহ কোনও ফাংশনে যেকোনো কল আমার ক্লোজ () উদাহরণস্বরূপ কল করবে। আমি সেই সময়ে ত্রুটিটি ফাঁদে ফেলতে চাই।

2
ব্যাতিক্রম ডটকম এই কার্যকারিতা সরবরাহ করে এবং কেবলমাত্র তার "প্রহরী" কার্যকারিতা সহ অপরিজ্ঞাত কার্যকারিতা সম্পর্কিত ত্রুটিগুলি ধরাতে টেলরোরড করা যেতে পারে।
স্টিভেন ওয়েক্সলার

উত্তর:


192

এটি কি আপনাকে সহায়তা করে:

<script type="text/javascript">
window.onerror = function() {
    alert("Error caught");
};

xxx();
</script>

আমি নিশ্চিত না যদিও এটি কীভাবে ফ্ল্যাশ ত্রুটিগুলি পরিচালনা করে ...

আপডেট: এটি অপেরাতে কাজ করে না, তবে কী তা কী তা দেখার জন্য আমি এখনই ড্রাগনফ্লাই হ্যাক করছি। ড্রাগনফ্লাই হ্যাকিং সম্পর্কে পরামর্শ এই প্রশ্ন থেকে এসেছে:

নকল উইন্ডো। জাভাস্ক্রিপ্ট ব্যবহার করে অপেরাতে অনারার


3
এইচপি, ফাইল_লোক, লাইন_ কোনও প্যারাম যোগ করার সাথে এটি আমার পক্ষে করা উচিত। ধন্যবাদ!

1
আমি কি সঠিকভাবে বুঝতে পারি যে এই কোডটি কোনও বিদ্যমান ত্রুটি হ্যান্ডলারকে ওভাররাইড করে?
মার্স রবার্টসন

@ মার্স রবার্টসন নং
আটিলান

@atilkan window.onerror = function() { alert(42) };এখন উত্তর কোড: ওভাররেড window.onerror = function() { alert("Error caught"); };না, আমি এখনও নিশ্চিত না ..
মঙ্গল রবার্টসন

@ মার্স রবার্টসন এটি সম্ভবত ওভাররাইট করে। হ্যাঁ, এটি কেবল পরীক্ষিত। অ্যাডএভেন্টলিস্টনার ব্যবহার করা আরও ভাল।
এটেলিকান

646

আনহানডেল করা জাভাস্ক্রিপ্ট ত্রুটিগুলি কীভাবে ধরবেন

window.onerrorইভেন্টটিকে হ্যান্ডলারের মতো ইভেন্টটি বরাদ্দ করুন :

<script type="text/javascript">
window.onerror = function(msg, url, line, col, error) {
   // Note that col & error are new to the HTML 5 spec and may not be 
   // supported in every browser.  It worked for me in Chrome.
   var extra = !col ? '' : '\ncolumn: ' + col;
   extra += !error ? '' : '\nerror: ' + error;

   // You can view the information in an alert to see things working like this:
   alert("Error: " + msg + "\nurl: " + url + "\nline: " + line + extra);

   // TODO: Report this error via ajax so you can keep track
   //       of what pages have JS issues

   var suppressErrorAlert = true;
   // If you return true, then error alerts (like in older versions of 
   // Internet Explorer) will be suppressed.
   return suppressErrorAlert;
};
</script>

কোডটিতে মন্তব্য হিসাবে, যদি এর ফেরতের মান window.onerrorহয় trueতবে ব্রাউজারটি একটি সতর্কতা ডায়ালগ দেখিয়ে দমন করা উচিত।

উইন্ডো.অনরারের ইভেন্টটি কখন আগুন দেয়?

সংক্ষেপে, ইভেন্টটি উত্থাপিত হয় যখন হয় 1) একটি অপ্রকাশিত ব্যতিক্রম বা 2.) একটি সংকলনের সময় ত্রুটি ঘটে।

অপ্রকাশিত ব্যতিক্রম

  • "কিছু বার্তা" নিক্ষেপ
  • call_something_undefined ();
  • ক্রস_রিগিন_আইফ্রেমে.কন্টিনিউ উইন্ডো.ডোকামেন্ট ;, একটি সুরক্ষা ব্যতিক্রম

সংকলন ত্রুটি

  • <script>{</script>
  • <script>for(;)</script>
  • <script>"oops</script>
  • setTimeout("{", 10);, এটি স্ক্রিপ্ট হিসাবে প্রথম যুক্তি সংকলন করার চেষ্টা করবে

উইন্ডো.অনরার সমর্থনকারী ব্রাউজারগুলি

  • ক্রোম 13+
  • ফায়ারফক্স 6.0+
  • ইন্টারনেট এক্সপ্লোরার 5.5+
  • অপেরা 11.60+
  • সাফারি 5.1+

স্ক্রীনশট:

পরীক্ষার পৃষ্ঠায় এটি যুক্ত করার পরে ক্রিয়াকলাপে ওনারর কোডের উদাহরণ:

<script type="text/javascript">
call_something_undefined();
</script>

জাভাস্ক্রিপ্ট সতর্কতা উইন্ডো.অনরারের ইভেন্ট দ্বারা বিশদ সম্পর্কিত ত্রুটি সম্পর্কিত তথ্য দেখাচ্ছে

এজেএক্স ত্রুটি প্রতিবেদনের উদাহরণ

var error_data = {
    url: document.location.href,
};

if(error != null) {
    error_data['name'] = error.name; // e.g. ReferenceError
    error_data['message'] = error.line;
    error_data['stack'] = error.stack;
} else {
    error_data['msg'] = msg;
    error_data['filename'] = filename;
    error_data['line'] = line;
    error_data['col'] = col;
}

var xhr = new XMLHttpRequest();

xhr.open('POST', '/ajax/log_javascript_error');
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onload = function() {
    if (xhr.status === 200) {
        console.log('JS error logged');
    } else if (xhr.status !== 200) {
        console.error('Failed to log JS error.');
        console.error(xhr);
        console.error(xhr.status);
        console.error(xhr.responseText);
    }
};
xhr.send(JSON.stringify(error_data));

JSFiddle:

https://jsfiddle.net/nzfvm44d/

তথ্যসূত্র:


3
ফায়ারফক্স উল্লেখ করার মূল্য যখন throwম্যানুয়ালি তৈরি করা হয় ত্রুটি বার্তাটি ফেরত দেয় না । stackoverflow.com/questions/15036165/…
সেবাস

2
দুর্দান্ত উত্তর। আপনি জেএসএনলগের মতো একটি প্যাকেজ সহ "অজ্যাক্সের মাধ্যমে এই ত্রুটিটি প্রতিবেদন করুন" প্রয়োগ করতে পারেন যা আপনার জন্য এজাক্স এবং সার্ভারের পাশের লগিং করে।
ব্যবহারকারী 1147862

4
এই উত্তর ছাড়াও, আমি ত্রুটিযুক্ত বস্তুটি যুক্ত করেছি যাতে আমি স্ট্যাকের সন্ধান পেতে পারি। stackoverflow.com/a/20972210/511438 । এখন আমি আরও প্রতিক্রিয়া নিয়ে বিকাশ করতে পারি কারণ আমার দেব ত্রুটিগুলি পৃষ্ঠার শীর্ষে একটি বাক্স হিসাবে উপস্থিত হবে (যেমনটি আমি এটি তৈরি করেছি)।
ভালামাস

আপনার অনারার ()টিকে আরও ত্রুটি ছুঁড়তে আটকাতে, চেষ্টা করে (উপেক্ষা করুন) ব্লকে আপনার অ্যানরআর বাস্তবায়নটি প্যাক করা ভাল না? (এখানে এটি কেস নয়, তবে এটি নিশ্চিত হওয়া দরকার)
পিটার ডি বি

1
@ সুপার1ha1 আপনি কি একটি জিসফিল সরবরাহ করতে পারেন? আমি মনে করি না যে ব্রাউজারগুলি একটি ব্রেকিং প্রবর্তন করবে যেখানে অনরআর ইভেন্ট হ্যান্ডলারের ঘটনা গুলি চালানো বন্ধ করে দেয়। অনারার হ্যান্ডলারটি কাজ করে দেখতে আপনি এই jsfiddle চেষ্টা করতে পারেন: jsfiddle.net/nzfvm44d এটি এখনও আমার জন্য ক্রোম সংস্করণ 62.0.3202.94 (অফিসিয়াল বিল্ড) (Build৪-বিট) সংস্করণে কাজ করে।
স্যাম

38

পরিশীলিত ত্রুটি পরিচালনা

যদি আপনার ত্রুটি পরিচালনার বিষয়টি অত্যন্ত পরিশীলিত হয় এবং তাই এটির একটি ত্রুটি নিজেই ফেলে দিতে পারে তবে আপনি ইতিমধ্যে "ত্রুটিহ্যান্ডলিং-মোড" এ থাকলে এটি চিহ্নিত করে একটি পতাকা যুক্ত করা কার্যকর। তাই ভালো:

var appIsHandlingError = false;

window.onerror = function() {
    if (!appIsHandlingError) {
        appIsHandlingError = true;
        handleError();
    }
};

function handleError() {
    // graceful error handling
    // if successful: appIsHandlingError = false;
}

অন্যথায় আপনি নিজেকে একটি অসীম লুপে খুঁজে পেতে পারেন।


29
অথবা আরও ব্যর্থ-নিরাপদ উপায় হ'ল handleErrorপদ্ধতিটির আশেপাশে চেষ্টা চালানো ।
এইডিয়াকাপি

8
আপনি যদি ত্রুটিটি পরিচালনা করতে ত্রুটিযুক্ত হন তবে আপনি ধরা চেষ্টা ব্যবহার করতে পারবেন না। সুতরাং তিনি সমাধানটি ভাল থাকুন এবং ভাল সমাধান
এমরিস মাইরোইন

@ এমরিসমাইরোইন তবু এটি ত্রুটি পরিচালনা করে একটি সিঙ্ক বা অ্যাসিঙ্ক লুপ সৃষ্টি করবে এবং সম্ভবত ব্যবহারযোগ্য স্ট্যাকের তথ্য ছাড়াই ক্র্যাশ করবে।
inf3rno

1
আমি মনে করি পতাকাটি ঠিকঠাক হওয়া উচিত? আমি বিশ্বাস করি যদি বড় হয় তবে আমাদের চারপাশে চেষ্টা / ক্যাপচার দরকার এবং ওনাররর পদ্ধতিটি ছেড়ে যাওয়ার আগে পতাকাটি ঠিকঠাক হয়ে গেছে তা নিশ্চিত করুন। অন্যথায়, শুধুমাত্র একটি ত্রুটি পরিচালনা করা হবে।
Seb

23

অ্যাটাসাস চেষ্টা করুন যা আধুনিক ওয়েব অ্যাপ্লিকেশনগুলির জন্য উন্নত ত্রুটি ট্র্যাকিং এবং রিয়েল ব্যবহারকারী পর্যবেক্ষণ সরবরাহ করে provides

https://www.atatus.com/

সমস্ত ব্রাউজারে যুক্তিসঙ্গতভাবে সম্পূর্ণ স্ট্যাকট্রেসগুলি কীভাবে পাবেন তা আমাকে ব্যাখ্যা করতে দিন।

জাভাস্ক্রিপ্টে পরিচালনা করার সময় ত্রুটি

আধুনিক ক্রোম এবং অপেরা ত্রুটিযুক্ত এবং এর জন্য এইচটিএমএল 5 খসড়া স্পষ্টিকে সম্পূর্ণ সমর্থন করে window.onerror। এই উভয় ব্রাউজারেই আপনি হয় ব্যবহার করতে পারেন window.onerror, বা 'ত্রুটি' ইভেন্টটি সঠিকভাবে আবদ্ধ করতে পারেন :

// Only Chrome & Opera pass the error object.
window.onerror = function (message, file, line, col, error) {
    console.log(message, "from", error.stack);
    // You can send data to your server
    // sendError(data);
};
// Only Chrome & Opera have an error attribute on the event.
window.addEventListener("error", function (e) {
    console.log(e.error.message, "from", e.error.stack);
    // You can send data to your server
    // sendError(data);
})

দুর্ভাগ্যক্রমে ফায়ারফক্স, সাফারি এবং আইই এখনও রয়েছে এবং তাদেরও আমাদের সমর্থন করতে হবে। স্ট্যাকট্রেস না থাকায় window.onerrorআমাদের আরও কিছুটা কাজ করতে হবে do

দেখা যাচ্ছে যে ত্রুটি থেকে স্ট্যাকট্রেসগুলি পেতে আমরা যা করতে পারি তা হ'ল আমাদের সমস্ত কোডকে একটি try{ }catch(e){ }ব্লকে মোড়ানো এবং তারপরে লক্ষ্য করা e.stack। মোড়ক নামে একটি ফাংশন দিয়ে আমরা প্রক্রিয়াটি কিছুটা সহজ করতে পারি যা একটি ফাংশন নেয় এবং ভাল ত্রুটি হ্যান্ডলিং দিয়ে একটি নতুন ফাংশন দেয়।

function wrap(func) {
    // Ensure we only wrap the function once.
    if (!func._wrapped) {
        func._wrapped = function () {
            try{
                func.apply(this, arguments);
            } catch(e) {
                console.log(e.message, "from", e.stack);
                // You can send data to your server
                // sendError(data);
                throw e;
            }
        }
    }
    return func._wrapped;
};

এইটা কাজ করে. আপনি ম্যানুয়ালি মোড়ানো যে কোনও ফাংশনে হ্যান্ডলিংয়ে ভাল ত্রুটি থাকবে তবে দেখা যাচ্ছে যে বেশিরভাগ ক্ষেত্রে আমরা স্বয়ংক্রিয়ভাবে এটি আপনার জন্য করতে পারি।

গ্লোবাল সংজ্ঞাটি পরিবর্তন করে addEventListenerযাতে এটি স্বয়ংক্রিয়ভাবে কলব্যাক মোড়ায় আমরা try{ }catch(e){ }বেশিরভাগ কোডের চারপাশে স্বয়ংক্রিয়ভাবে সন্নিবেশ করতে পারি । এটি বিদ্যমান কোডটি কাজ চালিয়ে যেতে দেয়, তবে উচ্চ-মানের ব্যতিক্রম ট্র্যাকিং যোগ করে।

var addEventListener = window.EventTarget.prototype.addEventListener;
window.EventTarget.prototype.addEventListener = function (event, callback, bubble) {
    addEventListener.call(this, event, wrap(callback), bubble);
}

আমাদের এটিও removeEventListenerকাজ করে চলেছে তা নিশ্চিত করা দরকার । এই মুহূর্তে এটি হবে না কারণ যুক্তিটি addEventListenerপরিবর্তিত হয়েছে। আবার আমাদের কেবল এটির জন্য এটি ঠিক করতে হবে prototype:

var removeEventListener = window.EventTarget.prototype.removeEventListener;
window.EventTarget.prototype.removeEventListener = function (event, callback, bubble) {
    removeEventListener.call(this, event, callback._wrapped || callback, bubble);
}

আপনার ব্যাকএন্ডে ত্রুটি ডেটা প্রেরণ করুন

আপনি নিম্নলিখিত হিসাবে চিত্র ট্যাগ ব্যবহার করে ত্রুটি ডেটা প্রেরণ করতে পারেন

function sendError(data) {
    var img = newImage(),
        src = 'http://yourserver.com/jserror&data=' + encodeURIComponent(JSON.stringify(data));

    img.crossOrigin = 'anonymous';
    img.onload = function success() {
        console.log('success', data);
    };
    img.onerror = img.onabort = function failure() {
        console.error('failure', data);
    };
    img.src = src;
}

দাবি অস্বীকার: আমি https://www.atatus.com/ এ ওয়েব বিকাশকারী ।


আওয়ারয়ার / ইজারজার কী ? রেস্ট, ওয়েব সার্ভিস, ডাব্লুসিএফ পরিষেবা ? ব্যাকএন্ড সম্পর্কে কোন সহজ?
কিকিনেট

আপনি যদি নিজের সার্ভারে ব্যবহারকারী ব্রাউজার থেকে জেএস ত্রুটি প্রেরণ করতে চান। http://yourserver.comগ্রহণ এবং সঞ্চয় করতে আপনাকে আপনার ব্যাকএন্ড ( ) লিখতে হবে। আপনি যদি atatus.com চয়ন করেন তবে আপনার কিছু করার দরকার নেই। আপনার পৃষ্ঠায় কেবল দুটি লাইন স্ক্রিপ্ট অন্তর্ভুক্ত করুন।
ফিজার খান 25'15

18

দেখে মনে হচ্ছে যে window.onerrorসমস্ত সম্ভাব্য ত্রুটির অ্যাক্সেস সরবরাহ করে না। বিশেষত এটি উপেক্ষা করে:

  1. <img> লোডিং ত্রুটি (প্রতিক্রিয়া> = 400)।
  2. <script> লোডিং ত্রুটি (প্রতিক্রিয়া> = 400)।
  3. যদি আপনার অ্যাপ্লিকেশনটিতে আরও অনেক লাইব্রেরি থাকে তবে window.onerrorঅজানা উপায়ে (jquery, কৌনিক ইত্যাদি) ম্যানিপুলেট করে বিশ্বব্যাপী ত্রুটিগুলি ।
  4. সম্ভবত এখন এটি অন্বেষণ করার পরেও আমি অনেকগুলি ক্ষেত্রে আসেনি (iframes, স্ট্যাক ওভারফ্লো ইত্যাদি)।

এখানে এমন একটি স্ক্রিপ্টের সূচনা যা এই ত্রুটিগুলির অনেকটিকে ধরে ফেলবে, যাতে আপনি বিকাশের সময় আপনার অ্যাপ্লিকেশনে আরও দৃ rob় ডিবাগ যোগ করতে পারেন।

(function(){

/**
 * Capture error data for debugging in web console.
 */

var captures = [];

/**
 * Wait until `window.onload`, so any external scripts
 * you might load have a chance to set their own error handlers,
 * which we don't want to override.
 */

window.addEventListener('load', onload);

/**
 * Custom global function to standardize 
 * window.onerror so it works like you'd think.
 *
 * @see http://www.quirksmode.org/dom/events/error.html
 */

window.onanyerror = window.onanyerror || onanyerrorx;

/**
 * Hook up all error handlers after window loads.
 */

function onload() {
  handleGlobal();
  handleXMLHttp();
  handleImage();
  handleScript();
  handleEvents();
}

/**
 * Handle global window events.
 */

function handleGlobal() {
  var onerrorx = window.onerror;
  window.addEventListener('error', onerror);

  function onerror(msg, url, line, col, error) {
    window.onanyerror.apply(this, arguments);
    if (onerrorx) return onerrorx.apply(null, arguments);
  }
}

/**
 * Handle ajax request errors.
 */

function handleXMLHttp() {
  var sendx = XMLHttpRequest.prototype.send;
  window.XMLHttpRequest.prototype.send = function(){
    handleAsync(this);
    return sendx.apply(this, arguments);
  };
}

/**
 * Handle image errors.
 */

function handleImage() {
  var ImageOriginal = window.Image;
  window.Image = ImageOverride;

  /**
   * New `Image` constructor. Might cause some problems,
   * but not sure yet. This is at least a start, and works on chrome.
   */

  function ImageOverride() {
    var img = new ImageOriginal;
    onnext(function(){ handleAsync(img); });
    return img;
  }
}

/**
 * Handle script errors.
 */

function handleScript() {
  var HTMLScriptElementOriginal = window.HTMLScriptElement;
  window.HTMLScriptElement = HTMLScriptElementOverride;

  /**
   * New `HTMLScriptElement` constructor.
   *
   * Allows us to globally override onload.
   * Not ideal to override stuff, but it helps with debugging.
   */

  function HTMLScriptElementOverride() {
    var script = new HTMLScriptElement;
    onnext(function(){ handleAsync(script); });
    return script;
  }
}

/**
 * Handle errors in events.
 *
 * @see http://stackoverflow.com/questions/951791/javascript-global-error-handling/31750604#31750604
 */

function handleEvents() {
  var addEventListenerx = window.EventTarget.prototype.addEventListener;
  window.EventTarget.prototype.addEventListener = addEventListener;
  var removeEventListenerx = window.EventTarget.prototype.removeEventListener;
  window.EventTarget.prototype.removeEventListener = removeEventListener;

  function addEventListener(event, handler, bubble) {
    var handlerx = wrap(handler);
    return addEventListenerx.call(this, event, handlerx, bubble);
  }

  function removeEventListener(event, handler, bubble) {
    handler = handler._witherror || handler;
    removeEventListenerx.call(this, event, handler, bubble);
  }

  function wrap(fn) {
    fn._witherror = witherror;

    function witherror() {
      try {
        fn.apply(this, arguments);
      } catch(e) {
        window.onanyerror.apply(this, e);
        throw e;
      }
    }
    return fn;
  }
}

/**
 * Handle image/ajax request errors generically.
 */

function handleAsync(obj) {
  var onerrorx = obj.onerror;
  obj.onerror = onerror;
  var onabortx = obj.onabort;
  obj.onabort = onabort;
  var onloadx = obj.onload;
  obj.onload = onload;

  /**
   * Handle `onerror`.
   */

  function onerror(error) {
    window.onanyerror.call(this, error);
    if (onerrorx) return onerrorx.apply(this, arguments);
  };

  /**
   * Handle `onabort`.
   */

  function onabort(error) {
    window.onanyerror.call(this, error);
    if (onabortx) return onabortx.apply(this, arguments);
  };

  /**
   * Handle `onload`.
   *
   * For images, you can get a 403 response error,
   * but this isn't triggered as a global on error.
   * This sort of standardizes it.
   *
   * "there is no way to get the HTTP status from a 
   * request made by an img tag in JavaScript."
   * @see http://stackoverflow.com/questions/8108636/how-to-get-http-status-code-of-img-tags/8108646#8108646
   */

  function onload(request) {
    if (request.status && request.status >= 400) {
      window.onanyerror.call(this, request);
    }
    if (onloadx) return onloadx.apply(this, arguments);
  }
}

/**
 * Generic error handler.
 *
 * This shows the basic implementation, 
 * which you could override in your app.
 */

function onanyerrorx(entity) {
  var display = entity;

  // ajax request
  if (entity instanceof XMLHttpRequest) {
    // 400: http://example.com/image.png
    display = entity.status + ' ' + entity.responseURL;
  } else if (entity instanceof Event) {
    // global window events, or image events
    var target = entity.currentTarget;
    display = target;
  } else {
    // not sure if there are others
  }

  capture(entity);
  console.log('[onanyerror]', display, entity);
}

/**
 * Capture stuff for debugging purposes.
 *
 * Keep them in memory so you can reference them
 * in the chrome debugger as `onanyerror0` up to `onanyerror99`.
 */

function capture(entity) {
  captures.push(entity);
  if (captures.length > 100) captures.unshift();

  // keep the last ones around
  var i = captures.length;
  while (--i) {
    var x = captures[i];
    window['onanyerror' + i] = x;
  }
}

/**
 * Wait til next code execution cycle as fast as possible.
 */

function onnext(fn) {
  setTimeout(fn, 0);
}

})();

এটি এভাবে ব্যবহার করা যেতে পারে:

window.onanyerror = function(entity){
  console.log('some error', entity);
};

সম্পূর্ণ স্ক্রিপ্টটির একটি ডিফল্ট বাস্তবায়ন রয়েছে যা এটি সত্তা / ত্রুটিটি পেয়েছে তার একটি আধা-পঠনযোগ্য "প্রদর্শন" সংস্করণ প্রিন্ট করার চেষ্টা করে। অ্যাপ্লিকেশন-নির্দিষ্ট ত্রুটি হ্যান্ডলারের অনুপ্রেরণার জন্য ব্যবহার করা যেতে পারে। ডিফল্ট বাস্তবায়নও শেষ 100 টি ত্রুটি সত্তার জন্য একটি রেফারেন্স রাখে, যাতে আপনি ওয়েব কনসোলে তাদের যেমন ঘটে যাওয়ার পরে তা পরীক্ষা করতে পারেন:

window.onanyerror0
window.onanyerror1
...
window.onanyerror99

দ্রষ্টব্য: এটি বেশ কয়েকটি ব্রাউজার / নেটিভ কনস্ট্রাক্টরগুলিকে ওভাররাইড পদ্ধতি দ্বারা কাজ করে। এতে অনিচ্ছাকৃত পার্শ্ব-প্রতিক্রিয়া থাকতে পারে। তবে উন্নয়নের সময় ব্যবহার করা, ত্রুটিগুলি কোথায় ঘটছে তা নির্ধারণের জন্য, বিকাশের সময় নিউরেলিক বা সেন্ট্রির মতো পরিষেবাদিতে লগ প্রেরণ করার জন্য এটি কার্যকরভাবে কার্যকর হয়েছে যাতে আমরা বিকাশের সময় ত্রুটিগুলি পরিমাপ করতে পারি এবং মঞ্চায়নের ক্ষেত্রে আমরা কী চলছে তা ডিবাগ করতে পারি একটি গভীর স্তর। এটি তখন উত্পাদন বন্ধ করা যেতে পারে।

আশাকরি এটা সাহায্য করবে.


1
: দৃশ্যত চিত্র ত্রুটি ঘটনা আরম্ভ stackoverflow.com/a/18152753/607033
inf3rno

6
// display error messages for a page, but never more than 3 errors
window.onerror = function(msg, url, line) {
if (onerror.num++ < onerror.max) {
alert("ERROR: " + msg + "\n" + url + ":" + line);
return true;
}
}
onerror.max = 3;
onerror.num = 0;

6

পূর্বের সম্পর্কিত অনারার কলব্যাকও সংরক্ষণ করা উচিত

<script type="text/javascript">

(function() {
    var errorCallback = window.onerror;
    window.onerror = function () {
        // handle error condition
        errorCallback && errorCallback.apply(this, arguments);
    };
})();

</script>

3

যদি আপনি উভয় প্রশিক্ষিত ত্রুটি এবং অপরিশোধিত প্রতিশ্রুতি প্রত্যাখ্যানকে পরিচালনা করার জন্য একীভূত উপায় চান তবে আপনার অনাবৃত লাইব্রেরির দিকে নজর রাখতে পারে ।

সম্পাদনা

<script type="text/javascript" src=".../uncaught/lib/index.js"></script>

<script type="text/javascript">
    uncaught.start();
    uncaught.addListener(function (error) {
        console.log('Uncaught error or rejection: ', error.message);
    });
</script>

এটি উইন্ডো শুনতে। উইন্ডো.অনরআর ছাড়াও অপরিবর্তিত থাকা


2
উপরের উত্তরে ল্যান্স পোলার্ড কয়েকটি ত্রুটি উল্লেখ করেছে, এটি সাধারণ অনারার পরিচালনা করে না। আপনি গ্রন্থাগার তাদের পরিচালনা করে না? যদি তাদের কিছু, দয়া করে নির্দিষ্ট করুন?
মাইকেল ফ্রেইজিম

@ MiFreidgeimSO-stopbeingevil স্রেফ সোর্স কোডটি পরীক্ষা করেছে - দুর্ভাগ্যক্রমে এটি হয় না। আলেকসান্দ্র ওলেনিকভ: আপনি যদি এটি সমর্থন করতে পারেন তবে দুর্দান্ত লাগবে - আমি তারপরে আমার
ডাউনটোটকে

2

আমি ট্র্যাকজকে একবার চেষ্টা করার পরামর্শ দেব ।

পরিষেবা হিসাবে লগ ইন করার সময় এটি ত্রুটি।

এটি সেট আপ করা আশ্চর্যজনকভাবে সহজ। প্রতিটি পৃষ্ঠায় কেবল একটি <script> লাইন যুক্ত করুন এবং এটিই। এর অর্থ হ'ল এটি যদি আপনি পছন্দ করেন না তবে এটি মুছে ফেলা অবাক করা সহজ।

সেন্ট্রি (যেমন আপনি যদি নিজের সার্ভারটি হোস্ট করতে পারেন তবে ওপেন-সোর্স) এর মতো অন্যান্য পরিষেবাদি রয়েছে তবে এটি ট্র্যাকজেস যা করে তা করে না। ট্র্যাকজেস তাদের ব্রাউজার এবং আপনার ওয়েবসারভারের মধ্যে ব্যবহারকারীর মিথস্ক্রিয়াটি রেকর্ড করে যাতে আপনি কেবল কোনও ফাইল এবং লাইন নম্বর রেফারেন্সের (এবং সম্ভবত স্ট্যাক ট্রেস) এর বিপরীতে ত্রুটি তৈরির ব্যবহারকারীর পদক্ষেপগুলি সনাক্ত করতে পারেন।


2
নিখরচায় ট্রায়াল থাকলেও ট্র্যাকজেএস এর আর একটি নিখরচায় স্তর রয়েছে বলে মনে হয় না
পিকেডিং

ট্র্যাকিংয়ের জন্য এবং ত্রুটি সম্পর্কে সতর্ক হওয়ার জন্য এটি ঠিক আছে তবে হ্যান্ডলিং অংশটি সত্যিই সমাধান করে না। আদর্শভাবে আমি মনে করি প্রশ্নকর্তা এই ত্রুটিগুলি পরিচালনা করার জন্য একটি উপায় সন্ধান করছেন যাতে বাকী কোডটি এখনও চালিত হয়।
wgp

আপনি যদি ত্রুটি ইভেন্টটি ধরেন এবং স্ট্যাক ট্রেস এবং অ্যাপ্লিকেশনের স্থিতিতে লগারে একটি এক্সএইচআর কল যুক্ত করেন? ট্র্যাকজ কীভাবে ভাল?
inf3rno

2
@ inf3rno এটি স্ট্যাক ট্রেসের চেয়েও বেশি, যা ত্রুটির শুরুতে ট্র্যাক করে। ট্র্যাকজেএস পুরো ব্যবহারকারীর অধিবেশনটিকে ট্র্যাক করবে যাতে আপনি দেখতে পান যে এতে কী ঘটেছিল। এখানে একটি উদাহরণ হিসাবে একটি স্ক্রিনশট এর trackjs.com/assets/images/screenshot.png
কেনের

1

উইন্ডো.অনরারে একটি ফাংশন বরাদ্দ করে আপনি অনারারের ইভেন্টটি শোনেন:

 window.onerror = function (msg, url, lineNo, columnNo, error) {
        var string = msg.toLowerCase();
        var substring = "script error";
        if (string.indexOf(substring) > -1){
            alert('Script Error: See Browser Console for Detail');
        } else {
            alert(msg, url, lineNo, columnNo, error);
        }   
      return false; 
  };
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.