console.trace()
কনসোল এ তার ফলাফল আউটপুট।
আমি ফলাফলগুলি স্ট্রিং হিসাবে পেতে এবং সেগুলিকে একটি ফাইলে সংরক্ষণ করতে চাই।
আমি ফাংশনগুলির জন্য নামগুলি সংজ্ঞায়িত করি না এবং আমি তাদের নামগুলিও পেতে পারি না callee.caller.name
।
উত্তর:
আমি ফায়ারফক্স সম্পর্কে নিশ্চিত নই, তবে ভি 8 / ক্রোমে আপনি ত্রুটি নির্মাণকারীকে কল করা একটি পদ্ধতি ব্যবহার করতে পারেন captureStackTrace
। ( আরও তথ্য এখানে )
সুতরাং এটির একটি হ্যাকি উপায় হ'ল:
var getStackTrace = function() {
var obj = {};
Error.captureStackTrace(obj, getStackTrace);
return obj.stack;
};
console.log(getStackTrace());
getStackTrace
এটি ক্যাপচার হওয়ার পরে সাধারণত স্ট্যাকের উপরে থাকবে। সেখানে দ্বিতীয় যুক্তি getStackTrace
স্ট্যাক ট্রেস অন্তর্ভুক্ত করা থেকে বাদ দেয় ।
Error().stack
। যদিও অবজেক্ট এবং ফাংশনের নামগুলি ফায়ারফক্সে হারিয়ে গেছে এবং বস্তুর নাম ক্রোমে হারিয়েছে (একই Error.captureStackTrace
) তবে Error().stack
উভয় ব্রাউজারেই কাজ করে এবং এটি আমাকে ডিবাগ করার জন্য পর্যাপ্ত তথ্য দেয়।
ত্রুটি.স্ট্যাক আপনার যা প্রয়োজন। এটি ক্রোম এবং ফায়ারফক্সে কাজ করে। উদাহরণ স্বরূপ
try { var a = {}; a.debug(); } catch(ex) {console.log(ex.stack)}
ক্রোমে দেবে:
TypeError: Object #<Object> has no method 'debug'
at eval at <anonymous> (unknown source)
at eval (native)
at Object._evaluateOn (unknown source)
at Object._evaluateAndWrap (unknown source)
at Object.evaluate (unknown source)
এবং ফায়ারফক্সে:
@http://www.google.com.ua/:87 _firebugInjectedEvaluate("with(_FirebugCommandLine){try { var a = {}; a.debug() } catch(ex) {console.log(ex.stack)}\n};")
@http://www.google.com.ua/:87 _firebugEvalEvent([object Event])
@http://www.google.com.ua/:67
(new Error).stack
এটি আধুনিক ক্রোম, ফায়ারফক্স, অপেরা এবং আই 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 সমস্ত নির্ভরতা সহ মিনিফাইড পাঠ্য।
Stacktrace.js নামে একটি লাইব্রেরি রয়েছে যা আপনাকে ব্রাউজারের স্ট্যাকের চিহ্নগুলি দেয়। আপনি সহজেই স্ক্রিপ্টটি অন্তর্ভুক্ত করে এবং যেকোন সময় কল করে এটি ব্যবহার করতে পারেন:
var trace = printStackTrace();
কনস্ট্যান্টিনের দুর্দান্ত কোডটিতে এটি কেবলমাত্র একটি সামান্য বর্ধন। এটি নিক্ষেপ-ব্যয়ের ব্যয়কে কিছুটা কমিয়ে দেয় এবং কেবল ত্রুটি স্ট্যাকটি ইনস্ট্যান্ট করে তোলে:
function getStackTrace () {
let stack = new Error().stack || '';
stack = stack.split('\n').map(function (line) { return line.trim(); });
return stack.splice(stack[0] == 'Error' ? 2 : 1);
}
আমি সাধারণত একটি নির্দিষ্ট স্তরের স্ট্যাক ট্রেস চাই (আমার কাস্টম লগারের জন্য) তাই কল করার সময় এটিও সম্ভব:
getStackTrace()[2]; // get stack trace info 2 levels-deep
আপনি শুধুমাত্র প্রয়োজন var stack = new Error().stack
। এটি @ এসগোউরস উত্তরের সরলিকৃত সংস্করণ।
function foo() {
bar();
}
function bar() {
baz();
}
function baz() {
console.log(new Error().stack);
}
foo();
সম্ভবত প্রতিটি ব্রাউজারে (ক্রোমে কাজ করে) কাজ করবে না।
আমি নোডজেএস-তে জাভাস্ক্রিপ্টের স্ট্রিং ভেরিয়েবল হিসাবে স্ট্যাক ট্রেস পাওয়ার চেষ্টা করছিলাম এবং এই টিউটোরিয়ালটি আমাকে সহায়তা করেছিল। এটি আপনার দৃশ্যে কাজ করবে পাশাপাশি স্ট্যাক ট্রেস এর চেয়ে ত্রুটি অবজেক্টের মাধ্যমে মুদ্রণ করা হবে console.trace()
।
স্ট্যাক ট্রেস মুদ্রণের জন্য কোড:
function add(x, y) {
console.log(new Error().stack);
return x+y;
}