বর্তমানে জাভাস্ক্রিপ্টের কার্যনির্বাহী বিবৃতিটির লাইন সংখ্যা নির্ধারণের জন্য কোনও ব্যবস্থা আছে (এবং যদি তা হয় তবে এটি কী)?
বর্তমানে জাভাস্ক্রিপ্টের কার্যনির্বাহী বিবৃতিটির লাইন সংখ্যা নির্ধারণের জন্য কোনও ব্যবস্থা আছে (এবং যদি তা হয় তবে এটি কী)?
উত্তর:
var thisline = new Error().lineNumber
আপনি যে পরিবেশে এটি ব্যবহার করছেন তা যদি কাজ না করে তবে আপনি চেষ্টা করতে পারেন:
var stack = new Error().stack
তারপরে লাইন নম্বরটির জন্য স্ট্যাকের মাধ্যমে শিকার করুন।
lineNumber
ত্রুটিযুক্ত বস্তুগুলিতে সম্পত্তিটি বিদ্যমান নেই। দুটিও নয় stack
:-)
বিভিন্ন ব্রাউজার এবং ব্রাউজার সংস্করণগুলির মধ্যে কিছুটা আরও পোর্টেবল (ফায়ারফক্স, ক্রোম এবং আই 10 + এ কাজ করা উচিত):
function ln() {
var e = new Error();
if (!e.stack) try {
// IE requires the Error to actually be throw or else the Error's 'stack'
// property is undefined.
throw e;
} catch (e) {
if (!e.stack) {
return 0; // IE < 10, likely
}
}
var stack = e.stack.toString().split(/\r\n|\n/);
// We want our caller's frame. It's index into |stack| depends on the
// browser and browser version, so we need to search for the second frame:
var frameRE = /:(\d+):(?:\d+)[^\d]*$/;
do {
var frame = stack.shift();
} while (!frameRE.exec(frame) && stack.length);
return frameRE.exec(stack.shift())[1];
}
var frameRE = /:(\d+:\d+)[^\d]*$/;
যা অনেক বেশি কার্যকর, বিশেষত যখন জেএসকে একটি দীর্ঘ লাইনে মাইন করা হয়।
কিছু চিহ্ন খুঁজতে আপনি কোনও ফাংশনের উত্সকে বিশ্লেষণ করার চেষ্টা করতে পারেন।
এখানে একটি চটজলদি উদাহরণ (হ্যাঁ, এটি কিছুটা গোলমাল হয়েছে)।
function foo()
{
alert(line(1));
var a;
var b;
alert(line(2));
}
foo();
function line(mark)
{
var token = 'line\\(' + mark + '\\)';
var m = line.caller.toString().match(
new RegExp('(^(?!.*' + token + '))|(' + token + ')', 'gm')) || [];
var i = 0;
for (; i < m.length; i++) if (m[i]) break;
return i + 1;
}
আপনার কোডে নিম্নলিখিত স্নিপেট ইনজেকশন করুন:
console.debug("line:", /\(file:[\w\d/.-]+:([\d]+)/.exec(new Error().stack)[1]);
TypeError: /\(http:[\w\d/.-]+:([\d]+)/.exec(...) is null
।
আপনি চেষ্টা করতে পারেন:
window.onerror = handleError;
function handleError(err, url, line){
alert(err + '\n on page: ' + url + '\n on line: ' + line);
}
তারপরে আপনি যেখানে জানতে চান সেখানে একটি ত্রুটি নিক্ষেপ করুন (অতিরিক্ত কাঙ্ক্ষিত নয়, তবে আপনি ডিবাগ করলে এটি আপনাকে সহায়তা করতে পারে।
দ্রষ্টব্য: ওয়েবকিট বা অপেরাতেwindow.onerror
সংজ্ঞায়িত / পরিচালনা করা হয়নি (আমি শেষ বার যাচাই করেছি)
throwAndResume(resumeFunction);
যা পুনরায় কাজকর্ম সংরক্ষণ করবে, ত্রুটি নিক্ষেপ করবে এবং আপনার ত্রুটি হ্যান্ডলারে বিশদটি লগ করবে তারপরে আপনার প্রোগ্রামটি চালিয়ে যাওয়ার জন্য পুনরায় সূচনা কলকে কল করুন।
বিশুদ্ধরূপে কেউ ত্রুটি.স্ট্যাকের বাইরে লাইন নম্বর পেতে পারে না, কারণ কৌণিকের মধ্যে লাইন নম্বরটি সংকলিত কোডের লাইন নম্বর। তবে যে কোনও পদ্ধতিতে ত্রুটিটি তৈরি হয়েছিল তা একটি তথ্য পেতে পারে। এই কোড স্নিপেটে ক্লাস লগার একটি নতুন লগবুক এন্ট্রিতে এই টুকরো তথ্য যুক্ত করে।
https://stackblitz.com/edit/angular-logger?file=src/app/Logger/logger.ts
যদি আপনার কোডটি জাভাস্ক্রিপ্ট + পিএইচপি হয়, তবে বর্তমান পিএইচপি লাইন নম্বরটি আক্ষরিক ধ্রুবক হিসাবে জাভাস্ক্রিপ্টে উপলব্ধ, কারণ এটি পিএইচপি হিসাবে পাওয়া যায় <?= __LINE__ ?>
(এটি ধরে নিয়েছে যে আপনার পিএইচপি সংক্ষিপ্ত ট্যাগগুলি সক্ষম রয়েছে, স্পষ্টতই।)
সুতরাং, উদাহরণস্বরূপ, জাভাস্ক্রিপ্টে আপনি বলতে পারেন:
this_php_line_number = <?= __LINE__ ?>;
তবে, আপনি যদি সাবধান না হন তবে পিএইচপি লাইন নম্বরটি জাভাস্ক্রিপ্ট লাইন নম্বর থেকে আলাদা হতে পারে, কারণ ব্রাউজারটি দেখার আগে পিএইচপি "উত্সাহ" উত্সের লাইনগুলি। সুতরাং সমস্যাটি নিশ্চিত হয়ে যায় যে আপনার পিএইচপি এবং জাভাস্ক্রিপ্ট লাইন নম্বরগুলি একই রয়েছে। যদি তারা আলাদা হয় তবে এটি ব্রাউজারের জাভাস্ক্রিপ্ট ডিবাগারটি ব্যবহার করে অনেক কম আনন্দদায়ক করে তোলে।
সার্ভার-সাইড (পিএইচপি) এবং ব্রাউজার-সাইড (জাভাস্ক্রিপ্ট) লাইন নম্বরগুলি সিঙ্ক্রোনাইজ করার জন্য প্রয়োজনীয় নতুন লাইনের সঠিক সংখ্যাটি লিখে পিএইচপি বিবৃতি অন্তর্ভুক্ত করে আপনি লাইন নম্বরগুলি সমান নিশ্চিত করতে পারবেন।
আমার কোডটি কেমন দেখাচ্ছে তা এখানে:
<!DOCTYPE html>
<html lang="en">
<!-- Copyright 2016, 2017, me and my web site -->
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, user-scalable=yes">
<?php
...lots of PHP stuff here, including all PHP function definitions ...
echo str_repeat("\n",__LINE__-6); # Synchronize PHP and JavaScript line numbers
?>
<!-- *** this is line <?php echo __LINE__ . ' of ' . basename(__FILE__); ?> *** -->
<title>My web page title</title>
...lots of HTML and JavaScript stuff here...
</body>
</html>
<!-- *** this is line <?php echo __LINE__ . ' of ' . basename(__FILE__); ?> *** -->
মূল এই পিএইচপি বিবৃতি:
echo str_repeat("\n",__LINE__-6);
যা জাভাস্ক্রিপ্ট দ্বারা দেখা লাইন নম্বরটি পিএইচপি লাইন নম্বর হিসাবে একই হতে যথেষ্ট পরিমাণে নিউলাইনগুলিকে ছড়িয়ে দেয়। সমস্ত পিএইচপি ফাংশন সংজ্ঞা ইত্যাদি that রেখার উপরে, শীর্ষে রয়েছে।
এই লাইনের পরে, আমি পিএইচপি ব্যবহারের কোডটি কোডের মধ্যে সীমাবদ্ধ করে যা লাইন নম্বর পরিবর্তন করে না।
আমার পিএইচপি কোডটি ৮ ই লাইনে শুরু হওয়ার জন্য "-6" অ্যাকাউন্টগুলি আপনি যদি আপনার পিএইচপি কোডটি আগে শুরু করেন তবে আপনি এই সংখ্যাটি হ্রাস করবেন। কিছু লোক তাদের পিএইচপি ডানদিকে খুব ঠিক উপরে রাখে, এমনকি ডক্টইপিইপি থেকেও এগিয়ে।
(মেটা ভিউপোর্ট লাইনটি এই স্ট্যাক ওভারফ্লো প্রশ্নোত্তর প্রতি অ্যান্ড্রয়েড ক্রোম "ফন্ট বুস্টিং" অক্ষম করে: অ্যান্ড্রয়েডের ক্রোম ফন্টকে পুনরায় আকার দেয় it এটি বয়লারপ্লেট বিবেচনা করুন, যা প্রতিটি ওয়েব পৃষ্ঠার প্রয়োজন needs)
নিম্নলিখিত লাইনটি কেবল যাচাই করার জন্য যা আমি কোনও ভুল করি নি। ব্রাউজারের ডিবাগারে দেখা গেছে বা ডান-ক্লিক / সেভ-ওয়েব-পৃষ্ঠা দ্বারা, এটি একটি এইচটিএমএল মন্তব্যে পরিণত হয়েছে যা সঠিক উত্স ফাইলের নাম এবং লাইন নম্বরটি দেখায়:
<!-- *** this is line <?php echo __LINE__ . ' of ' . basename(__FILE__); ?> *** -->
হয়ে:
<!-- *** this is line 1234 of my_file.php *** -->
এখন, যেখানেই আমি একটি লাইন নম্বর দেখতে পাচ্ছি, এটি ত্রুটি বার্তায় বা জাভাস্ক্রিপ্ট ডিবাগারে থাকুক না কেন, এটি সঠিক। পিএইচপি লাইন নম্বর এবং জাভাস্ক্রিপ্ট লাইন নম্বর সবসময় সামঞ্জস্যপূর্ণ এবং অভিন্ন।