Node.js এ স্ট্যাক ট্রেস কীভাবে প্রিন্ট করা যায় তা কি কেউ জানেন?
Node.js এ স্ট্যাক ট্রেস কীভাবে প্রিন্ট করা যায় তা কি কেউ জানেন?
উত্তর:
যে কোনও Error
অবজেক্টের এমন stack
সদস্য রয়েছে যা সেটিকে নির্ধারণ করা হয়েছিল এমন জায়গায় আটকে দেয়।
var stack = new Error().stack
console.log( stack )
বা আরও সহজভাবে:
console.trace("Here I am!")
'util'
।
new Error().stack
, আপনি কনসোলকে জড়িত করতে চান না এমন ক্ষেত্রে কাজ করে।
trace
হ'ল এটি বর্তমান লাইন / প্রসঙ্গটিও দেখায় যা stack
হয় না। আমি যদি অনুমান করি যে আপনি নিজেই সেই লাইনটি তৈরি করতে চান তবে তথ্যটি ত্রুটিযুক্ত বস্তুতে রয়েছে।
এখন কনসোলের জন্য একটি উত্সর্গীকৃত ফাংশন রয়েছে :
console.trace()
--stack_trace_limit=200
ইতিমধ্যে উত্তর হিসাবে, আপনি কেবল ট্রেস কমান্ডটি ব্যবহার করতে পারেন :
console.trace("I am here");
তবে, আপনি যদি কোনও ব্যতিক্রমের স্ট্যাক ট্রেস লগ ইন করবেন সে সম্পর্কে অনুসন্ধান করতে এই প্রশ্নটিতে এসে পৌঁছেছেন, তবে আপনি কেবল ব্যতিক্রম অবজেক্টটিতে লগইন করতে পারেন।
try {
// if something unexpected
throw new Error("Something unexpected has occurred.");
} catch (e) {
console.error(e);
}
এটি লগ হবে:
ত্রুটি: অপ্রত্যাশিত কিছু ঘটেছে।
প্রধানত (সি: \ ব্যবহারকারীগণ \ আমার \ নথিগুলি \ মাই অ্যাপ \ অ্যাপ্লিকেশন: 9: 15)
অবজেক্টে। (সি: \ ব্যবহারকারীগণ \ আমার \ নথিগুলি \ মাই অ্যাপ \ অ্যাপ্লিকেশন: 17: 1)
মডিউল._কম্পাইল (মডিউল.জেএস: 460: 26)
অবজেক্ট.মোডুল._ এক্সটেনশন..জেজে (মডিউল.জেএস: 478: 10) )
মডিউল.এলডে (মডিউল.জেএস: 355: 32)
ফাংশন.মডিউল.এলডে (মডিউল.জেএস: 310: 12)
ফাংশন.মোডুল.আরুনমাইন (মডিউল.জেএস: 501: 10)
এ স্টার্টআপে ( নোড.জেএস) : 129: 16)
নোড.জেএস: 814: 3 এ
যদি আপনার নোড.জেএস সংস্করণটি 6.০.০ এর চেয়ে বেশি হয় তবে ব্যতিক্রমী অবজেক্টে লগইন করা যথেষ্ট হবে না। এই ক্ষেত্রে, এটি কেবল মুদ্রণ করবে:
[ত্রুটি: অপ্রত্যাশিত কিছু ঘটেছে]
নোড সংস্করণ <6 console.error(e.stack)
এর console.error(e)
জন্য, বর্তমান নোড সংস্করণটির মতো ত্রুটি বার্তা এবং সম্পূর্ণ স্ট্যাক প্রিন্ট করার পরিবর্তে ব্যবহার করুন ।
দ্রষ্টব্য: যদি ব্যতিক্রমটি স্ট্রিংয়ের মতো তৈরি করা হয় throw "myException"
তবে স্ট্যাকের ট্রেস এবং লগিং e.stack
ফলন অপরিশোধিত পুনরুদ্ধার করা সম্ভব নয় ।
নিরাপদ থাকতে, আপনি ব্যবহার করতে পারেন
console.error(e.stack || e);
এবং এটি পুরানো এবং নতুন নোড.জেএস সংস্করণগুলির জন্য কাজ করবে।
console.error(e)
প্রিন্ট সবকিছু মধ্যে e
অবজেক্ট সহ e.stack
?
Error
আরও পঠনযোগ্য উপায়ে কনসোলে স্ট্যাকট্রেস প্রিন্ট করতে :
console.log(ex, ex.stack.split("\n"));
উদাহরণ ফলাফল:
[Error] [ 'Error',
' at repl:1:7',
' at REPLServer.self.eval (repl.js:110:21)',
' at Interface.<anonymous> (repl.js:239:12)',
' at Interface.EventEmitter.emit (events.js:95:17)',
' at Interface._onLine (readline.js:202:10)',
' at Interface._line (readline.js:531:8)',
' at Interface._ttyWrite (readline.js:760:14)',
' at ReadStream.onkeypress (readline.js:99:10)',
' at ReadStream.EventEmitter.emit (events.js:98:17)',
' at emitKey (readline.js:1095:12)' ]
সহজেই উপলব্ধ নোড মডিউলটির সাহায্যে নোডের বাইরে পূর্ণ দৈর্ঘ্যের স্ট্যাকের চিহ্ন পাওয়া সম্ভব (সামান্য পারফরম্যান্স পেনাল্টি হলেও): http://www.mattinsler.com/post/26396305882/announcing-longjohn-long-stack -traces-জন্য-নোড-JS
ব্যবহার করে দেখুন Error.captureStackTrace (targetObject [constructorOpt]) ।
const myObj = {};
function c() {
// pass
}
function b() {
Error.captureStackTrace(myObj)
c()
}
function a() {
b()
}
a()
console.log(myObj.stack)
ফাংশন a
এবং b
ত্রুটি স্ট্যাক এবং ক্যাপচার করা হয় myObj
।
stack
সম্পত্তি পেতে একটি ত্রুটি চান , আপনাকে নোড> = 6: এ কল করতে হবে Error.captureStackTrace(error)
।
Error.captureStackTrace
স্ট্যাক ট্রেসটিতে প্রদর্শিত না করতে চান তবে আপনি এটি constructorOpt
আরগ হিসাবে পাস করে বাদ দিতে পারেন ।
আমি জানি যে নোডেজগুলিতে সম্পূর্ণ স্ট্যাক ট্রেস মুদ্রণ করা সম্ভব নয়, আপনি কেবল "আংশিক" স্ট্যাক ট্রেস মুদ্রণ করতে পারেন, আপনি কোডটি কোথা থেকে এসেছেন তা দেখতে পাচ্ছেন না, কেবল যেখানে ব্যতিক্রম ঘটে। রায়ান ডাহল এই ইউটিউব ভিডিওতে এটি ব্যাখ্যা করেছেন। সুনির্দিষ্ট হওয়ার জন্য 56 মিনিটে http://youtu.be/jo_B4LTHi3I । আশাকরি এটা সাহায্য করবে
@ আইস্যাকের উত্তরটি সঠিক, তবে আপনার যদি আরও নির্দিষ্ট বা ক্লিনার ত্রুটির স্ট্যাকের প্রয়োজন হয় তবে আপনি এই ফাংশনটি ব্যবহার করতে পারেন:
function getCleanerStack() {
var err = new Error();
Error.captureStackTrace(err, getStack);
return err.stack;
}
এই ফাংশনটি সরাসরি নোডজেএস- এ console.trace
ফাংশন থেকে অনুপ্রাণিত হয় ।
উত্স কোড: সাম্প্রতিক সংস্করণ বা পুরানো সংস্করণ ।
err.stack
আরও সঠিক উত্তর।
আপনি যদি কেবল ত্রুটির স্ট্যাক ট্রেস লগ করতে চান (এবং ত্রুটি বার্তা নয়) নোড 6 এবং তারপরে স্বয়ংক্রিয়ভাবে স্ট্যাক ট্রেসের ভিতরে ত্রুটির নাম এবং বার্তা অন্তর্ভুক্ত রয়েছে, যা আপনি কিছু কাস্টম ত্রুটি পরিচালনা করতে চাইলে কিছুটা বিরক্তিকর:
console.log(error.stack.replace(error.message, ''))
এই কর্মচক্রটি কেবল ত্রুটির নাম এবং স্ট্যাক ট্রেস লগইন করবে (যাতে আপনি উদাহরণস্বরূপ ত্রুটি বার্তাটি ফর্ম্যাট করতে পারেন এবং আপনার কোডের অন্য কোথাও কীভাবে চান তা প্রদর্শন করতে পারেন)।
উপরের উদাহরণটি কেবল স্ট্যাক ট্রেস অনুসরণ করে ত্রুটির নাম মুদ্রণ করবে, উদাহরণস্বরূপ:
Error:
at /Users/cfisher/Git/squashed/execProcess.js:6:17
at ChildProcess.exithandler (child_process.js:213:5)
at emitTwo (events.js:106:13)
at ChildProcess.emit (events.js:191:7)
at maybeClose (internal/child_process.js:877:16)
at Socket.<anonymous> (internal/child_process.js:334:11)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at Pipe._handle.close [as _onclose] (net.js:498:12)
পরিবর্তে:
Error: Error: Command failed: sh ./commands/getBranchCommitCount.sh HEAD
git: 'rev-lists' is not a git command. See 'git --help'.
Did you mean this?
rev-list
at /Users/cfisher/Git/squashed/execProcess.js:6:17
at ChildProcess.exithandler (child_process.js:213:5)
at emitTwo (events.js:106:13)
at ChildProcess.emit (events.js:191:7)
at maybeClose (internal/child_process.js:877:16)
at Socket.<anonymous> (internal/child_process.js:334:11)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at Pipe._handle.close [as _onclose] (net.js:498:12)
যদি কেউ এখনও আমার মতো এটির সন্ধান করে তবে সেখানে একটি মডিউল রয়েছে যা আমরা "স্ট্যাক-ট্রেস" নামে অভিহিত করতে পারি। এটি সত্যিই জনপ্রিয়। এনপিএম লিংক
তারপরে ট্রেস দিয়ে হাঁটুন।
var stackTrace = require('stack-trace');
.
.
.
var trace = stackTrace.get();
trace.map(function (item){
console.log(new Date().toUTCString() + ' : ' + item.toString() );
});
অথবা কেবলমাত্র ট্রেস মুদ্রণ করুন:
var stackTrace = require('stack-trace');
.
.
.
var trace = stackTrace.get();
trace.toString();
আপনি নোড-স্ট্যাক-ট্রেস মডিউলটি ব্যবহার করতে পারেন যা কল স্ট্যাকগুলি ট্র্যাক করার জন্য একটি পাওয়ার পূর্ণ মডিউল।
sys.puts(new Error().stack)
(সিস্টেম মডিউল যুক্ত করার পরে)