আমি কীভাবে জাভাস্ক্রিপ্টে বর্তমান লাইন নম্বর নির্ধারণ করতে পারি?


96

বর্তমানে জাভাস্ক্রিপ্টের কার্যনির্বাহী বিবৃতিটির লাইন সংখ্যা নির্ধারণের জন্য কোনও ব্যবস্থা আছে (এবং যদি তা হয় তবে এটি কী)?


উত্তর:


69

var thisline = new Error().lineNumber

আপনি যে পরিবেশে এটি ব্যবহার করছেন তা যদি কাজ না করে তবে আপনি চেষ্টা করতে পারেন:

var stack = new Error().stack

তারপরে লাইন নম্বরটির জন্য স্ট্যাকের মাধ্যমে শিকার করুন।


4
আইই তে কাজ করবে না, lineNumberত্রুটিযুক্ত বস্তুগুলিতে সম্পত্তিটি বিদ্যমান নেই। দুটিও নয় stack:-)
অ্যান্ডি ই

4
আইই তে কোথাও একটি লাইন নম্বর রয়েছে। আমি এটি জানি কারণ যখন আমার জাভাস্ক্রিপ্টে একটি ত্রুটি ছুঁড়েছে তখন বলে যে এটি 100 মিলিয়নেরও বেশি সংখ্যার একটি লাইনে রয়েছে।
মালফিস্ট

আমি সঠিক নম্বরটি পাই না, এটি 1350 যখন এটি 1250 হওয়া উচিত
Fzs2

4
সমস্যা: আপনি যদি পিএইচপি ব্যবহার করেন তবে জাভাস্ক্রিপ্ট দ্বারা দেখা "উত্স কোড" মূল উত্স কোড নয়, সুতরাং এর ভুল লাইন নম্বর রয়েছে। (এটি সম্ভবত হারমানের ঘটছে)) জাভাস্ক্রিপ্টটি কীভাবে আসল পিএইচপি উত্স কোড লাইন নম্বর দেখতে হয় তা কী কেউ জানেন? সমাধানটি সম্ভবত কোনও ধরণের "উত্স মানচিত্র" প্রজন্মের সাথে জড়িত, তবে কীভাবে এটি করব তা আমি খুঁজে পাচ্ছি না। নিশ্চয়ই এটি একটি সমাধান সমস্যা, তাই না ??
ডেভ বার্টন

দ্রষ্টব্য: কখনও কখনও ত্রুটি বস্তুটি তৈরি করা হয় তখন কেবল স্ট্যাক / লাইন নম্বর পাওয়া যায় না, কেবল যখন তা নিক্ষেপ করা হয়, উদাহরণস্বরূপ গুগল অ্যাপস স্ক্রিপ্টে - সেক্ষেত্রে সমাধানের জন্য এই উত্তরটি দেখুন ।
ব্যবহারকারী 202729

38

তুমি ব্যবহার করতে পার:

function test(){
    console.trace();
}

test();

4
এখনও পর্যন্ত সহজ সমাধান এবং এটি এমএস এজতেও কাজ করে।
বিপদ

27

বিভিন্ন ব্রাউজার এবং ব্রাউজার সংস্করণগুলির মধ্যে কিছুটা আরও পোর্টেবল (ফায়ারফক্স, ক্রোম এবং আই 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];
}

ধন্যবাদ আমি আপনার পরামর্শটি এর সাথে মানিয়ে নিয়েছি: stackoverflow.com/a/37081135/470749
রায়ান

4
আপনি যদি রেজেক্সটি সামঞ্জস্য করেন তবে আপনি লাইন এবং কলাম উভয়ই ফিরিয়ে দিতে পারবেন: var frameRE = /:(\d+:\d+)[^\d]*$/;যা অনেক বেশি কার্যকর, বিশেষত যখন জেএসকে একটি দীর্ঘ লাইনে মাইন করা হয়।
কুইন কমেন্ডেন্ট

সতর্কতা, ক্রোমের জন্য ভায়োলেন্টমনকি স্ক্রিপ্টগুলিতে কাজ করে না - আপনি একটি বোগাস নম্বর পাবেন, কেন তা জানেন না।
hanshenrik

5

কিছু চিহ্ন খুঁজতে আপনি কোনও ফাংশনের উত্সকে বিশ্লেষণ করার চেষ্টা করতে পারেন।
এখানে একটি চটজলদি উদাহরণ (হ্যাঁ, এটি কিছুটা গোলমাল হয়েছে)।

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;
}

3

আপনার কোডে নিম্নলিখিত স্নিপেট ইনজেকশন করুন:

console.debug("line:", /\(file:[\w\d/.-]+:([\d]+)/.exec(new Error().stack)[1]);

প্রোটোকলের নামটি প্রয়োজনীয় হিসাবে প্রতিস্থাপন করুন (যেমন "http:")
ক্রিশুশু

4
আমি এই কাজ করতে পারেন না। আমি পেতে TypeError: /\(http:[\w\d/.-]+:([\d]+)/.exec(...) is null
রায়ান

2

আপনি চেষ্টা করতে পারেন:

window.onerror = handleError;
function handleError(err, url, line){
    alert(err + '\n on page: ' + url + '\n on line: ' + line);
}

তারপরে আপনি যেখানে জানতে চান সেখানে একটি ত্রুটি নিক্ষেপ করুন (অতিরিক্ত কাঙ্ক্ষিত নয়, তবে আপনি ডিবাগ করলে এটি আপনাকে সহায়তা করতে পারে।

দ্রষ্টব্য: ওয়েবকিট বা অপেরাতেwindow.onerror সংজ্ঞায়িত / পরিচালনা করা হয়নি (আমি শেষ বার যাচাই করেছি)



4
মজাদার. এমনকি আপনি একটি বিশেষ ক্রিয়াকলাপ তৈরি করতে পারেন throwAndResume(resumeFunction);যা পুনরায় কাজকর্ম সংরক্ষণ করবে, ত্রুটি নিক্ষেপ করবে এবং আপনার ত্রুটি হ্যান্ডলারে বিশদটি লগ করবে তারপরে আপনার প্রোগ্রামটি চালিয়ে যাওয়ার জন্য পুনরায় সূচনা কলকে কল করুন।
z5h

0

বিশুদ্ধরূপে কেউ ত্রুটি.স্ট্যাকের বাইরে লাইন নম্বর পেতে পারে না, কারণ কৌণিকের মধ্যে লাইন নম্বরটি সংকলিত কোডের লাইন নম্বর। তবে যে কোনও পদ্ধতিতে ত্রুটিটি তৈরি হয়েছিল তা একটি তথ্য পেতে পারে। এই কোড স্নিপেটে ক্লাস লগার একটি নতুন লগবুক এন্ট্রিতে এই টুকরো তথ্য যুক্ত করে।

https://stackblitz.com/edit/angular-logger?file=src/app/Logger/logger.ts


-2

যদি আপনার কোডটি জাভাস্ক্রিপ্ট + পিএইচপি হয়, তবে বর্তমান পিএইচপি লাইন নম্বরটি আক্ষরিক ধ্রুবক হিসাবে জাভাস্ক্রিপ্টে উপলব্ধ, কারণ এটি পিএইচপি হিসাবে পাওয়া যায়   <?= __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 *** -->

এখন, যেখানেই আমি একটি লাইন নম্বর দেখতে পাচ্ছি, এটি ত্রুটি বার্তায় বা জাভাস্ক্রিপ্ট ডিবাগারে থাকুক না কেন, এটি সঠিক। পিএইচপি লাইন নম্বর এবং জাভাস্ক্রিপ্ট লাইন নম্বর সবসময় সামঞ্জস্যপূর্ণ এবং অভিন্ন।

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