আমি যখন একটি ব্যতিক্রম ছুঁড়ে ফেলি তখন কীভাবে আমি জাভাস্ক্রিপ্ট স্ট্যাক ট্রেস পেতে পারি?


518

যদি আমি নিজেই জাভাস্ক্রিপ্টের ব্যতিক্রম ছুঁড়ে ফেলি (উদাঃ throw "AArrggg"), আমি কীভাবে স্ট্যাক ট্রেস পেতে পারি (ফায়ারব্যাগে বা অন্যথায়)? এখনই আমি বার্তাটি পেয়েছি।

সম্পাদনা করুন : নীচের অনেক লোক পোস্ট করেছেন, জাভাস্ক্রিপ্ট ব্যতিক্রমের জন্য স্ট্যাক ট্রেস পাওয়া সম্ভব তবে আমি আমার ব্যতিক্রমগুলির জন্য স্ট্যাক ট্রেস পেতে চাই । উদাহরণ স্বরূপ:

function foo() {
    bar(2);
}
function bar(n) {
    if (n < 2)
        throw "Oh no! 'n' is too small!"
    bar(n-1);
}

যখন fooবলা হয়, আমি একটি স্ট্যাক ট্রেস যা কল অন্তর্ভুক্ত পেতে চান foo, bar, bar



২০০৮ সাল থেকে ফায়ারবগ বাগ ট্র্যাকারে বাগ এখনও খোলা আছে: কোড. google.com/p/fbug/issues/detail?id=1260 - এটি তারকা!
মিলার মেডিরিস

13
উত্তরটি "নতুন ত্রুটি নিক্ষেপ করা উচিত ('অ্যারেঞ্জ');" এই সুন্দরভাবে লিখিত পৃষ্ঠাটি দেখুন: devthought.com/2011/12/22/a-string-is-not-an-error
মার্জিত পাশা

1
(2013) আপনি এখন ফায়ারফক্সে ফায়ারবগের স্ট্যাক ট্রেসগুলি পেতে পারেন এমনকি যদি এটি সহজ হয় তবে throw 'arrrgh';এগুলি একই রকম মনে হয় throw new Error('arrrgh');। ক্রোম ডিবাগারের এখনও throw new Error('arrrgh');বলা আছে, তবে (তবে ক্রোম আরও অনেক বিশদ ট্রেস দিবে বলে মনে হচ্ছে) needs
user56reinstatemonica8

26
@ চেটানস্ট্রি আমি 'জাভাস্ক্রিপ্ট স্ট্যাক ট্রেস' এর জন্য গুগল করেছি এবং এটিই প্রথম ফলাফল
ডেভিড সাইকস

উত্তর:


754

সম্পাদনা 2 (2017):

সমস্ত আধুনিক ব্রাউজারে আপনি কেবল কল করতে পারেন: console.trace(); (MDN রেফারেন্স)

সম্পাদনা 1 (2013):

মূল প্রশ্নের মতামতগুলিতে নির্দেশিত হিসাবে একটি ভাল (এবং সহজ) সমাধান হ'ল এই stackজাতীয় কোনও Errorবস্তুর সম্পত্তি ব্যবহার করা :

function stackTrace() {
    var err = new Error();
    return err.stack;
}

এটি এর মতো আউটপুট উত্পন্ন করবে:

DBX.Utils.stackTrace@http://localhost:49573/assets/js/scripts.js:44
DBX.Console.Debug@http://localhost:49573/assets/js/scripts.js:9
.success@http://localhost:49573/:462
x.Callbacks/c@http://localhost:49573/assets/js/jquery-1.10.2.min.js:4
x.Callbacks/p.fireWith@http://localhost:49573/assets/js/jquery-1.10.2.min.js:4
k@http://localhost:49573/assets/js/jquery-1.10.2.min.js:6
.send/r@http://localhost:49573/assets/js/jquery-1.10.2.min.js:6

ইউআরএল, কলিং ফাংশন ইত্যাদির সাথে কলিং ফাংশনের নাম দেওয়া।

আসল (২০০৯):

এই স্নিপেটের একটি পরিবর্তিত সংস্করণ কিছুটা সহায়তা করতে পারে:

function stacktrace() { 
  function st2(f) {
    return !f ? [] : 
        st2(f.caller).concat([f.toString().split('(')[0].substring(9) + '(' + f.arguments.join(',') + ')']);
  }
  return st2(arguments.callee.caller);
}

11
আমি নিশ্চিত নই কেন এটি কেন বেশি বেশি ভোট দেয় না - অন্যান্য উত্তরগুলি আমার পক্ষে ঠিক তেমন কার্যকর হয়নি। বিটিডাব্লু, আর্গুমেন্টগুলিকে অ্যারের হিসাবে ব্যবহার করবেন না তা নিশ্চিত করুন (আপডেট হওয়া স্নিপেট এখানে: gist.github.com/965603 )
রিপার 234

1
ক্রোমে কাজ করছে না, ট্যাকট্রেস (): [ব্যাতিক্রম: প্রকারের ত্রুটি: অবজেক্ট # <অবজেক্ট> এর কোনও পদ্ধতি নেই
হেটাওব্লগ

3
মূল প্রশ্নে মন্তব্য দেখুন: আপনার কাস্টম কোডের দরকার নেই, কেবল "নিক্ষেপ নতুন ত্রুটি ('আরআরজি')" ব্যবহার করুন
জোশুয়া রিচার্ডসন

16
ত্রুটি.স্ট্যাকটি IE এ অপরিজ্ঞাত করা হয়েছে, কেবল ক্রোম এবং মজিলা ফায়ারফক্সে কাজ করে
ফিলিপ মুনিন

4
নোট যে callerএখন অবচয় করা হয়েছে এবং calleeES5 কঠোর মোড থেকে সরানো হয়েছে। এখানে কেন stackoverflow.com/questions/103598/...
PhilT

187

নোট করুন যে ক্রোমিয়াম / ক্রোম (ভি 8 ব্যবহার করে অন্যান্য ব্রাউজারগুলি) এবং ফায়ারফক্সের ত্রুটিযুক্ত বস্তুগুলির স্ট্যাক সম্পত্তি দ্বারা স্ট্যাকট্রেস পেতে একটি সুবিধাজনক ইন্টারফেস রয়েছে ।

try {
   // Code throwing an exception
} catch(e) {
  console.log(e.stack);
}

এটি বেস ব্যতিক্রমগুলির পাশাপাশি আপনার নিজেরাই ছুঁড়ে ফেলার জন্য প্রযোজ্য। (বিবেচনা করা হচ্ছে যে আপনি ত্রুটি শ্রেণি ব্যবহার করেন, যা যাইহোক একটি ভাল অনুশীলন)।

ভি 8 ডকুমেন্টেশনের বিবরণ দেখুন


12
ফায়ারফক্সও .stackসম্পত্তি সমর্থন করে ।
কেনেটিএম

2
আমি যদি 100 বার উপার্জন করতে পারি! আপনাকে জোসলিন ধন্যবাদ। এটি সত্যই অনেক সাহায্য করেছে
সাফরাজিক

1
আপনি এটি ব্যবহার করতে পারেন console.error(e.stack);যাতে এটি কোনও ডিফল্ট ব্যতিক্রম বার্তার মতো লাগে
ব্রুনো পেরেস

80

ফায়ারফক্সে মনে হচ্ছে আপনার ব্যতিক্রম ছোঁড়ার দরকার নেই। এটা যথেষ্ট

e = new Error();
console.log(e.stack);

পাশাপাশি মোবাইল অ্যাপ্লিকেশনগুলিতে কাজ করে (জেকিউএম ব্যবহার করে নির্মিত)।
সামিক আর

ক্রোমিয়ামেও কাজ করে (যাইহোক সংস্করণ 43)।
অ্যান্ডি বেভারলি

ফায়ারফক্স 59-এ window.onerrorএটি মাধ্যমে কাজ করার সময় কাজ হয় না , এটি কেবলমাত্র onerrorফাংশন সহ প্রায় শূন্য স্ট্যাক প্রদর্শন করে।
কোড

আরও ভাল, আপনি করতে পারেন: console.log(new Error().stack)> :(> :(> :(
অ্যান্ড্রু

25

আপনার যদি ফায়ারব্যাগ থাকে তবে স্ক্রিপ্ট ট্যাবে সমস্ত ত্রুটি বিকল্পের উপর ব্রেক রয়েছে। স্ক্রিপ্টটি আপনার ব্রেকপয়েন্টে পৌঁছে গেলে আপনি ফায়ারব্যাগের স্ট্যাক উইন্ডোটি দেখতে পারেন:

স্ক্রিনশট


5
এইচআরএম, এটি কাজ করে বলে মনে হচ্ছে না। এটি জাভাস্ক্রিপ্ট দ্বারা উত্থাপিত ত্রুটিগুলির একটি ডিবাগারে আমাকে থামিয়েছে (যেমন, অপরিজ্ঞাত পরিবর্তনশীল ত্রুটিগুলি), কিন্তু আমি যখন আমার নিজের ব্যতিক্রমগুলি ছুঁড়ে ফেলি তখনও আমি "আনকান্ট ব্যতিক্রম" বার্তা ছাড়া আর কিছুই পাই না।
ডেভিড ওলবার

11

মূল প্রশ্নের মন্তব্যে যেমন উল্লেখ করা হয়েছে তেমন একটি ভাল (এবং সাধারণ) সমাধান হ'ল এই stackজাতীয় কোনও Errorবস্তুর সম্পত্তি ব্যবহার করা :

function stackTrace() {
    var err = new Error();
    return err.stack;
}

এটি এর মতো আউটপুট উত্পন্ন করবে:

DBX.Utils.stackTrace@http://localhost:49573/assets/js/scripts.js:44
DBX.Console.Debug@http://localhost:49573/assets/js/scripts.js:9
.success@http://localhost:49573/:462
x.Callbacks/c@http://localhost:49573/assets/js/jquery-1.10.2.min.js:4
x.Callbacks/p.fireWith@http://localhost:49573/assets/js/jquery-1.10.2.min.js:4
k@http://localhost:49573/assets/js/jquery-1.10.2.min.js:6
.send/r@http://localhost:49573/assets/js/jquery-1.10.2.min.js:6

ইউআরএল এবং লাইন নম্বর, এর কলিং ফাংশন, ইত্যাদি সহ কলিং ফাংশনটির নাম দেওয়া।

আমার বর্তমানে একটি বিস্তৃত এবং সুন্দর সমাধান আছে যা আমি বর্তমানে একটি প্রকল্পের জন্য তৈরি করেছি যা আমি বর্তমানে কাজ করছি এবং আমি সাধারণীকরণের জন্য এটি বের করে এনে কিছুটা পুনরায় কাজ করেছি। এটা এখানে:

(function(context){
    // Only global namespace.
    var Console = {
        //Settings
        settings: {
            debug: {
                alwaysShowURL: false,
                enabled: true,
                showInfo: true
            },
            stackTrace: {
                enabled: true,
                collapsed: true,
                ignoreDebugFuncs: true,
                spacing: false
            }
        }
    };

    // String formatting prototype function.
    if (!String.prototype.format) {
        String.prototype.format = function () {
            var s = this.toString(),
                args = typeof arguments[0],
                args = (("string" == args || "number" == args) ? arguments : arguments[0]);
            if (!arguments.length)
                return s;
            for (arg in args)
                s = s.replace(RegExp("\\{" + arg + "\\}", "gi"), args[arg]);
            return s;
        }
    }

    // String repeating prototype function.
    if (!String.prototype.times) {
        String.prototype.times = function () {
            var s = this.toString(),
                tempStr = "",
                times = arguments[0];
            if (!arguments.length)
                return s;
            for (var i = 0; i < times; i++)
                tempStr += s;
            return tempStr;
        }
    }

    // Commonly used functions
    Console.debug = function () {
        if (Console.settings.debug.enabled) {
            var args = ((typeof arguments !== 'undefined') ? Array.prototype.slice.call(arguments, 0) : []),
                sUA = navigator.userAgent,
                currentBrowser = {
                    firefox: /firefox/gi.test(sUA),
                    webkit: /webkit/gi.test(sUA),
                },
                aLines = Console.stackTrace().split("\n"),
                aCurrentLine,
                iCurrIndex = ((currentBrowser.webkit) ? 3 : 2),
                sCssBlack = "color:black;",
                sCssFormat = "color:{0}; font-weight:bold;",
                sLines = "";

            if (currentBrowser.firefox)
                aCurrentLine = aLines[iCurrIndex].replace(/(.*):/, "$1@").split("@");
            else if (currentBrowser.webkit)
                aCurrentLine = aLines[iCurrIndex].replace("at ", "").replace(")", "").replace(/( \()/gi, "@").replace(/(.*):(\d*):(\d*)/, "$1@$2@$3").split("@");

            // Show info if the setting is true and there's no extra trace (would be kind of pointless).
            if (Console.settings.debug.showInfo && !Console.settings.stackTrace.enabled) {
                var sFunc = aCurrentLine[0].trim(),
                    sURL = aCurrentLine[1].trim(),
                    sURL = ((!Console.settings.debug.alwaysShowURL && context.location.href == sURL) ? "this page" : sURL),
                    sLine = aCurrentLine[2].trim(),
                    sCol;

                if (currentBrowser.webkit)
                    sCol = aCurrentLine[3].trim();

                console.info("%cOn line %c{0}%c{1}%c{2}%c of %c{3}%c inside the %c{4}%c function:".format(sLine, ((currentBrowser.webkit) ? ", column " : ""), ((currentBrowser.webkit) ? sCol : ""), sURL, sFunc),
                             sCssBlack, sCssFormat.format("red"),
                             sCssBlack, sCssFormat.format("purple"),
                             sCssBlack, sCssFormat.format("green"),
                             sCssBlack, sCssFormat.format("blue"),
                             sCssBlack);
            }

            // If the setting permits, get rid of the two obvious debug functions (Console.debug and Console.stackTrace).
            if (Console.settings.stackTrace.ignoreDebugFuncs) {
                // In WebKit (Chrome at least), there's an extra line at the top that says "Error" so adjust for this.
                if (currentBrowser.webkit)
                    aLines.shift();
                aLines.shift();
                aLines.shift();
            }

            sLines = aLines.join(((Console.settings.stackTrace.spacing) ? "\n\n" : "\n")).trim();

            trace = typeof trace !== 'undefined' ? trace : true;
            if (typeof console !== "undefined") {
                for (var arg in args)
                    console.debug(args[arg]);

                if (Console.settings.stackTrace.enabled) {
                    var sCss = "color:red; font-weight: bold;",
                        sTitle = "%c Stack Trace" + " ".times(70);

                    if (Console.settings.stackTrace.collapsed)
                        console.groupCollapsed(sTitle, sCss);
                    else
                        console.group(sTitle, sCss);

                    console.debug("%c" + sLines, "color: #666666; font-style: italic;");

                    console.groupEnd();
                }
            }
        }
    }
    Console.stackTrace = function () {
        var err = new Error();
        return err.stack;
    }

    context.Console = Console;
})(window);

এটি গিটহাবে পরীক্ষা করুন (বর্তমানে v1.2)! আপনি এটির মতো ব্যবহার করতে পারেন Console.debug("Whatever");এবং সেটিংসের উপর নির্ভর করে Consoleআউটপুট এবং স্ট্যাক ট্রেস (বা কেবল সাধারণ তথ্য / অতিরিক্ত কিছু নয়) মুদ্রণ করুন। এখানে একটি উদাহরণ:

Console.js

Consoleঅবজেক্টের সেটিংসের সাথে চারপাশে খেলা নিশ্চিত করুন ! আপনি ট্রেসের লাইনের মধ্যে ব্যবধান যোগ করতে এবং এটি পুরোপুরি বন্ধ করতে পারেন। এখানে এটি Console.traceসেট করা আছে false:

দিশাহীন

এমনকি আপনি দেখানো প্রথম বিট বন্ধ (সেট Console.settings.debug.showInfoকরা false) বা ডিবাগিং পুরোপুরি অক্ষম Console.settings.debug.enabledকরতে falseপারেন (সেট করা ) যাতে আপনাকে আর কোনও ডিবাগের বিবৃতিতে মন্তব্য করতে হবে না! কেবল তাদের মধ্যে রেখে দিন এবং এটি কিছুই করবে না।


10

আমি মনে করি না এর মধ্যে এমন কিছু নির্মিত যা আপনি ব্যবহার করতে পারবেন তবে আমি নিজেরাই ঘূর্ণায়মান প্রচুর উদাহরণ পেয়েছি।


আহ, ধন্যবাদ - প্রথম লিঙ্কটি দেখে মনে হচ্ছে এটি করতে পারে (যদিও পুনরাবৃত্তির সহায়তার অভাবে এটি অকার্যকর হতে পারে)।
ডেভিড ওলবার

হ্যাঁ, আমি প্রথম নজরে এমন কোনও পুনরাবৃত্তি সমর্থিত দেখিনি। আমি এটির কোন ভাল সমাধান আছে কিনা তা জানতে আগ্রহী হব।
মার্ক বাইক

1
আমি মনে করি যে দ্বিতীয় লিঙ্কটি ফায়ারফক্স এবং অপেরার জন্য পুনরাবৃত্তি সমর্থন করবে কারণ এটি আর্গুমেন্ট ভেরিয়েবল ব্যবহার করে ম্যানুয়ালি তৈরির পরিবর্তে ত্রুটি স্ট্যাক ট্রেস ব্যবহার করে। আপনি যদি পুনরাবৃত্তি ইস্যুটির জন্য কোনও ক্রস ব্রাউজার সমাধান খুঁজে পান তবে আমি শুনতে চাই (প্রথম নিবন্ধটি আমার)। :)
হেলিফ্যান্ট

হেলিফ্যান্ট: দ্বিতীয়টি এখানে কাজ করবে না কারণ, আমি যখন ব্যতিক্রমটি ধরি তখন এটি একটি "স্ট্রিং" (যেমন, কোনও "e.stack" নয়): foo = ফাংশন () {"আর্গ" ফেলে দিন; } চেষ্টা {foo (); } ক্যাচ (ই) {/ * টাইপ ই == "স্ট্রিং" * /} সম্ভবত আমি এটিকে ভুল করে দিচ্ছি? (কীভাবে বোকা জাভাস্ক্রিপ্ট টিউটোরিয়ালগুলি সম্পর্কে
বাধ্যবাধকতা শুরু করুন

একটি বস্তু নিক্ষেপ করার চেষ্টা করুন: throw { name: 'NameOfException', message: 'He's dead, Jim' }
অ্যারন দিগুল্লা

7

আপনি কোনও উদাহরণের stack( stacktraceঅপেরাতে) বৈশিষ্ট্যগুলি অ্যাক্সেস করতে পারেন Errorএমনকি আপনি এটি ছুড়ে ফেলে দিলেও। জিনিস আপনি কি নিশ্চিতরূপে ব্যবহার করতে হবে, হয় throw new Error(string)(ভুলবেন না নতুন পরিবর্তে throw string

উদাহরণ:

try {
    0++;
} catch (e) {
    var myStackTrace = e.stack || e.stacktrace || "";
}

স্ট্যাকট্রেস অপেরাতে কাজ করে না। এমনকি আমি এটি সম্পর্কে কিছু খুঁজে পাচ্ছি না।
এনভিআই

@ এনভি: মনে হচ্ছে স্ট্যাকট্রেস ব্যবহারকারী-নির্মিত ত্রুটিগুলিতে নেই তাই পরিবর্তে আপনার এটি করা উচিত: {0 ++} ক্যাপচার (ই) {মাইস্ট্যাকট্রেস = ইস্ট্যাক চেষ্টা করুন || e.stacktrace}
এলি গ্রে


7

এটি আধুনিক ক্রোম, অপেরা, ফায়ারফক্স এবং আই 10 + এর জন্য স্ট্যাক ট্রেস (স্ট্রিংগুলির অ্যারে হিসাবে) দেবে

function getStackTrace () {

  var stack;

  try {
    throw new Error('');
  }
  catch (error) {
    stack = error.stack || '';
  }

  stack = stack.split('\n').map(function (line) { return line.trim(); });
  return stack.splice(stack[0] == 'Error' ? 2 : 1);
}

ব্যবহার:

console.log(getStackTrace().join('\n'));

এটি স্ট্যাক থেকে নিজস্ব কলের পাশাপাশি শিরোনাম "ত্রুটি" বাদ দেয় যা ক্রোম এবং ফায়ারফক্স (তবে আইআই নয়) ব্যবহার করে।

এটি পুরানো ব্রাউজারগুলিতে ক্রাশ হওয়া উচিত নয় তবে খালি অ্যারেটি ফিরতে হবে। আপনার যদি আরও সার্বজনীন সমাধানের প্রয়োজন হয় তবে stacktrace.js এ দেখুন । সমর্থিত ব্রাউজারগুলির এর তালিকাটি সত্যিই চিত্তাকর্ষক তবে আমার মনে মনে এটি ছোট কাজটির জন্য এটি খুব বড়: 37Kb সমস্ত নির্ভরতা সহ মিনিফাইড পাঠ্য।


7

ইউজিনের উত্তরের একটি আপডেট: ত্রুটি অবজেক্টটি আইপি (নির্দিষ্ট সংস্করণ?) এর জন্য stackসম্পত্তিটি বসানোর জন্য অবশ্যই নিক্ষেপ করতে হবে । নিম্নলিখিতটি তার বর্তমান উদাহরণের চেয়ে আরও ভাল কাজ করা উচিত, এবং undefinedযখন আইই তে থাকে তখন এড়ানো উচিত ।

function stackTrace() {
  try {
    var err = new Error();
    throw err;
  } catch (err) {
    return err.stack;
  }
}

দ্রষ্টব্য 1: এই ধরণের জিনিসটি কেবলমাত্র ডিবাগিংয়ের সময় করা উচিত, এবং লাইভ থাকাকালীন অক্ষম করা হয়, বিশেষত যদি প্রায়শই ডাকা হয়। দ্রষ্টব্য 2: এটি সমস্ত ব্রাউজারগুলিতে কাজ না করে তবে এফএফ এবং আইই 11 এ কাজ করতে পারে বলে মনে হচ্ছে এটি আমার প্রয়োজনের জন্য ঠিক আছে।


6

ফায়ারবগে একটি সত্যিকারের স্ট্যাক ট্রেস পাওয়ার একটি উপায় একটি অনির্ধারিত ফাংশন কল করার মতো একটি সত্য ত্রুটি তৈরি করা:

function foo(b){
  if (typeof b !== 'string'){
    // undefined Error type to get the call stack
    throw new ChuckNorrisError("Chuck Norris catches you.");
  }
}

function bar(a){
  foo(a);
}

foo(123);

অথবা স্ট্যাকের ট্রেস দেখায় এমন console.error()একটি throwবিবৃতি অনুসরণ করে ব্যবহার করুন useconsole.error()


4

এই পলিফিল কোডটি আধুনিক (2017) ব্রাউজারগুলিতে কাজ করছে (আইই 11, অপেরা, ক্রোম, ফায়ারফক্স, ইয়ানডেক্স):

printStackTrace: function () {
    var err = new Error();
    var stack = err.stack || /*old opera*/ err.stacktrace || ( /*IE11*/ console.trace ? console.trace() : "no stack info");
    return stack;
}

অন্যান্য উত্তর:

function stackTrace() {
  var err = new Error();
  return err.stack;
}

আইই 11 এ কাজ করছেন না!

আর্গুমেন্টস.ক্যালি.ক্যালার ব্যবহার করে - কোনও ব্রাউজারে কঠোর মোডে কাজ করছে না!


3

গুগল ক্রোমে (১৯.০ সংস্করণ এবং তার পরে সংস্করণ) কেবল ব্যতিক্রম ছোঁড়া পুরোপুরি কার্যকর হয়। উদাহরণ স্বরূপ:

/* file: code.js, line numbers shown */

188: function fa() {
189:    console.log('executing fa...');
190:    fb();
191: }
192:
193: function fb() {
194:    console.log('executing fb...');
195:    fc()
196: }
197:
198: function fc() {
199:    console.log('executing fc...');
200:    throw 'error in fc...'
201: }
202:
203: fa();

ব্রাউজারের কনসোল আউটপুটে স্ট্যাক ট্রেস প্রদর্শন করবে:

executing fa...                         code.js:189
executing fb...                         code.js:194
executing fc...                         cdoe.js:199
/* this is your stack trace */
Uncaught error in fc...                 code.js:200
    fc                                  code.js:200
    fb                                  code.js:195
    fa                                  code.js:190
    (anonymous function)                code.js:203

এই সাহায্য আশা করি।


3

ফাংশন:

function print_call_stack(err) {
    var stack = err.stack;
    console.error(stack);
}

ব্যবহারের ক্ষেত্রে:

     try{
         aaa.bbb;//error throw here
     }
     catch (err){
         print_call_stack(err); 
     }

2
<script type="text/javascript"
src="https://rawgithub.com/stacktracejs/stacktrace.js/master/stacktrace.js"></script>
<script type="text/javascript">
    try {
        // error producing code
    } catch(e) {
        var trace = printStackTrace({e: e});
        alert('Error!\n' + 'Message: ' + e.message + '\nStack trace:\n' + trace.join('\n'));
        // do something else with error
    }
</script>

এই স্ক্রিপ্ট ত্রুটি প্রদর্শন করবে


2
function stacktrace(){
  return (new Error()).stack.split('\n').reverse().slice(0,-2).reverse().join('\n');
}

2
যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে এবং / বা কেন এটি সমস্যার সমাধান করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করলে উত্তরের দীর্ঘমেয়াদী মান উন্নত হবে।
ডোনাল্ড ডাক

1

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

2 টি রূপ - স্ট্যাকএফএন (এন) আপনাকে তাত্ক্ষণিক কলার থেকে দূরে ফাংশনটির নাম দেয় এবং স্ট্যাকআর্য () আপনাকে তাত্ক্ষণিক কলার হয়ে একটি অ্যারে, স্ট্যাকআরে () [0] দেয়।

Http://jsfiddle.net/qcP9y/6/ এ চেষ্টা করে দেখুন

// returns the name of the function at caller-N
// stackFN()  = the immediate caller to stackFN
// stackFN(0) = the immediate caller to stackFN
// stackFN(1) = the caller to stackFN's caller
// stackFN(2) = and so on
// eg console.log(stackFN(),JSON.stringify(arguments),"called by",stackFN(1),"returns",retval);
function stackFN(n) {
    var r = n ? n : 0, f = arguments.callee,avail=typeof f === "function",
        s2,s = avail ? false : new Error().stack;
    if (s) {
        var tl=function(x) { s = s.substr(s.indexOf(x) + x.length);},
        tr = function (x) {s = s.substr(0, s.indexOf(x) - x.length);};
        while (r-- >= 0) {
            tl(")");
        }
        tl(" at ");
        tr("(");
        return s;
    } else {
        if (!avail) return null;
        s = "f = arguments.callee"
        while (r>=0) {
            s+=".caller";
            r--;   
        }
        eval(s);
        return f.toString().split("(")[0].trim().split(" ")[1];
    }
}
// same as stackFN() but returns an array so you can work iterate or whatever.
function stackArray() {
    var res=[],f = arguments.callee,avail=typeof f === "function",
        s2,s = avail ? false : new Error().stack;
    if (s) {
        var tl=function(x) { s = s.substr(s.indexOf(x) + x.length);},
        tr = function (x) {s = s.substr(0, s.indexOf(x) - x.length);};
        while (s.indexOf(")")>=0) {
            tl(")");
            s2= ""+s;
            tl(" at ");
            tr("(");
            res.push(s);
            s=""+s2;
        }
    } else {
        if (!avail) return null;
        s = "f = arguments.callee.caller"
        eval(s);
        while (f) {
            res.push(f.toString().split("(")[0].trim().split(" ")[1]);
            s+=".caller";
            eval(s);
        }
    }
    return res;
}


function apple_makes_stuff() {
    var retval = "iPhones";
    var stk = stackArray();

    console.log("function ",stk[0]+"() was called by",stk[1]+"()");
    console.log(stk);
    console.log(stackFN(),JSON.stringify(arguments),"called by",stackFN(1),"returns",retval);
    return retval;
}



function apple_makes (){
    return apple_makes_stuff("really nice stuff");
}

function apple () {
    return apple_makes();
}

   apple();

1

আপনি এই গ্রন্থাগারটি http://www.stacktracejs.com/ ব্যবহার করতে পারেন । এটা খুব ভালো

ডকুমেন্টেশন থেকে

আইই বা সাফারি 5- তে স্ট্যাকট্রেস না পাওয়া পেতে আপনি নিজের ত্রুটিটিও পাস করতে পারেন

<script type="text/javascript" src="https://rawgithub.com/stacktracejs/stacktrace.js/master/stacktrace.js"></script>
<script type="text/javascript">
    try {
        // error producing code
    } catch(e) {
        var trace = printStackTrace({e: e});
        alert('Error!\n' + 'Message: ' + e.message + '\nStack trace:\n' + trace.join('\n'));
        // do something else with error
    }
</script>

সংযুক্ত উত্সটি https://rawgithub.com/stacktracejs/stacktrace.js/master/stacktrace.jsএকটি পুরানো সংস্করণ, https://raw.githubusercontent.com/stacktracejs/stacktrace.js/stable/stacktrace.js
সর্বাধিক

1

এখানে একটি উত্তর যা আপনাকে সর্বাধিক পারফরম্যান্স দেয় (আই 6+) এবং সর্বাধিক সামঞ্জস্যতা। আই 6 এর সাথে সামঞ্জস্যপূর্ণ!

    function stacktrace( log_result ) {
    	var trace_result;
    // IE 6 through 9 compatibility
    // this is NOT an all-around solution because
    // the callee property of arguments is depredicated
    /*@cc_on
    	// theese fancy conditinals make this code only run in IE
    	trace_result = (function st2(fTmp) {
    		// credit to Eugene for this part of the code
    		return !fTmp ? [] :
    			st2(fTmp.caller).concat([fTmp.toString().split('(')[0].substring(9) + '(' + fTmp.arguments.join(',') + ')']);
    	})(arguments.callee.caller);
    	if (log_result) // the ancient way to log to the console
    		Debug.write( trace_result );
    	return trace_result;
    @*/
    	console = console || Console;	// just in case
    	if (!(console && console.trace) || !log_result){
    		// for better performance in IE 10
    		var STerror=new Error();
    		var unformated=(STerror.stack || STerror.stacktrace);
    		trace_result = "\u25BC console.trace" + unformated.substring(unformated.indexOf('\n',unformated.indexOf('\n'))); 
    	} else {
    		// IE 11+ and everyone else compatibility
    		trace_result = console.trace();
    	}
    	if (log_result)
    		console.log( trace_result );
    	
    	return trace_result;
    }
// test code
(function testfunc(){
	document.write( "<pre>" + stacktrace( false ) + "</pre>" );
})();


0

ফায়ারফক্সে স্ট্যাকের সন্ধান পাওয়া IE এর চেয়ে সহজ তবে আপনি এখানে যা করতে চান তা মূলত এখানে:

"সমস্যাযুক্ত" কোডের টুকরোটি চেষ্টা / ক্যাচ ব্লকে মোড়ক করুন:

try {
    // some code that doesn't work
    var t = null;
    var n = t.not_a_value;
}
    catch(e) {
}

আপনি যদি "ত্রুটি" অবজেক্টের বিষয়বস্তুগুলি পরীক্ষা করেন তবে এটিতে নিম্নলিখিত ক্ষেত্রগুলি রয়েছে:

e.fileName: উত্স ফাইল / পৃষ্ঠা যেখানে সমস্যাটি এসেছে e.lineNumber থেকে: ফাইল / পৃষ্ঠাতে লাইন নম্বর যেখানে সমস্যাটি দেখা দিয়েছে e.message: একটি সাধারণ বার্তা যা কী ধরনের ত্রুটি ঘটেছে তা বর্ণনা করে e.name: প্রকার যে ত্রুটিটি ঘটেছিল তার উপরের উদাহরণে এটি 'টাইপআরর' হওয়া উচিত। স্ট্যাক: ব্যতিক্রম ঘটায় এমন স্ট্যাক ট্রেস ধারণ করে

আমি মনে করি এটা আপনার কাজে লাগবে.


1
ভুল। তিনি তার OWN ব্যতিক্রমগুলি ধরার চেষ্টা করছেন। যদি সে "এসএসডিএফজি" ছুড়ে দেয় তবে সে স্ট্রিং অবজেক্টটি পাবে, কোনও ব্যতিক্রম বস্তু নয়। তিনি অন্তর্নির্মিত ব্যতিক্রমগুলি ধরার চেষ্টা করছেন না।
ইভান ভুইকা

0

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

try{ null.toString(); } catch(e) { alert(e.stack); }

সতর্কতা ((নতুন ত্রুটি ())। স্ট্যাক);
সমৃদ্ধ remer

0

বাহ - আমি 6 বছরের মধ্যে কোনও একক ব্যক্তিকে দেখতে পাচ্ছি না যে stackএটি ব্যবহারের আগে পাওয়া যায় কিনা তা দেখতে আমরা প্রথমে পরীক্ষা করে দেখি! কোনও ত্রুটি হ্যান্ডলারের মধ্যে আপনি যে খারাপ কাজটি করতে পারেন তা হ'ল অস্তিত্বহীন এমন কিছু কল করার কারণে একটি ত্রুটি নিক্ষেপ করা।

অন্যরা যেমন বলেছে, stackএখন বেশিরভাগ ক্ষেত্রেই নিরাপদ এখন এটি আই 9 বা তার আগে সমর্থিত নয়।

আমি আমার অপ্রত্যাশিত ত্রুটিগুলি লগইন করি এবং স্ট্যাক ট্রেসটি বেশ প্রয়োজনীয়। সর্বাধিক সহায়তার জন্য আমি প্রথমে Error.prototype.stackউপস্থিত কিনা তা একটি ফাংশন কিনা তা পরীক্ষা করে দেখুন । যদি তাই হয় তবে এটি ব্যবহার করা নিরাপদ error.stack

        window.onerror = function (message: string, filename?: string, line?: number, 
                                   col?: number, error?: Error)
        {
            // always wrap error handling in a try catch
            try 
            {
                // get the stack trace, and if not supported make our own the best we can
                var msg = (typeof Error.prototype.stack == 'function') ? error.stack : 
                          "NO-STACK " + filename + ' ' + line + ':' + col + ' + message;

                // log errors here or whatever you're planning on doing
                alert(msg);
            }
            catch (err)
            {

            }
        };

সম্পাদনা: এটি প্রদর্শিত হয় যেহেতু stackএকটি সম্পত্তি এবং কোনও পদ্ধতি নয় আপনি এটি নিরাপদে এমনকি পুরানো ব্রাউজারগুলিতেও কল করতে পারেন। আমি এখনও বিভ্রান্ত কারণ আমি নিশ্চিত ছিলাম যে Error.prototypeআমার জন্য পরীক্ষা করা আগে কাজ করেছিল এবং এখন তা হয় না - তাই আমি নিশ্চিত না যে কী হচ্ছে।


0

console.error(e.stack)ফায়ারফক্স ব্যবহার করা কেবল লগগুলিতে স্ট্যাকট্রেস দেখায়, ক্রোম বার্তাটিও দেখায়। যদি বার্তায় গুরুত্বপূর্ণ তথ্য থাকে তবে এটি একটি খারাপ অবাক হতে পারে। সর্বদা উভয় লগ।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.