জাভাস্ক্রিপ্টে নির্দিষ্ট ত্রুটিগুলি পরিচালনা করা (ব্যতিক্রমগুলি ভাবেন)


112

আপনি কীভাবে বিভিন্ন ধরণের ত্রুটিগুলি প্রয়োগ করবেন, যাতে আপনি নির্দিষ্টগুলি ধরতে সক্ষম হন এবং অন্যকে বুদবুদ করতে দেন ..?

এটি অর্জনের একটি উপায় Errorঅবজেক্টের প্রোটোটাইপটি পরিবর্তন করা :

Error.prototype.sender = "";


function throwSpecificError()
{
    var e = new Error();

    e.sender = "specific";

    throw e;
}

নির্দিষ্ট ত্রুটি ধরা:

try
{
    throwSpecificError();
}

catch (e)
{
    if (e.sender !== "specific") throw e;

    // handle specific error
}


আপনারা কি কোনও বিকল্প পেয়েছেন?

উত্তর:


159

কাস্টম ব্যতিক্রমগুলি তৈরি করতে, আপনি ত্রুটিযুক্ত বস্তু থেকে উত্তরাধিকারী হতে পারেন:

function SpecificError () {

}

SpecificError.prototype = new Error();

// ...
try {
  throw new SpecificError;
} catch (e) {
  if (e instanceof SpecificError) {
   // specific error
  } else {
    throw e; // let others bubble up
  }
}

ত্রুটি থেকে উত্তরাধিকারসূত্রে ছাড়াই একটি সংক্ষিপ্ত পন্থা, নাম এবং বার্তার বৈশিষ্ট্যযুক্ত একটি সাধারণ বস্তু নিক্ষেপ করা হতে পারে:

function throwSpecificError() {
  throw {
    name: 'SpecificError',
    message: 'SpecificError occurred!'
  };
}


// ...
try {
  throwSpecificError();
} catch (e) {
  if (e.name == 'SpecificError') {
   // specific error
  } else {
    throw e; // let others bubble up
  }
}

2
ইনহেরিটিংয়ের Errorসমস্যা রয়েছে। দেখুন স্ট্যাকওভারফ্লো.com
ক্রিসেন্ট টাটকা

5
এই } catch (e) { if (e.name == 'SpecificError') { // specific error } else { throw e; // let others bubble up } }কোডটিতে সমস্যা: এটি আই 7 এ কাজ করবে না, "ব্যতিক্রম ছোঁড়া এবং ধরা পড়ে না" ত্রুটি উত্থাপন করে। নিম্নলিখিতটি এমএসডিএন থেকে অত্যন্ত বোকা (বরাবরের মতো) ব্যাখ্যা: "আপনি একটি থ্রো স্টেটমেন্টটি অন্তর্ভুক্ত করেছিলেন তবে এটি একটি চেষ্টা ব্লকের মধ্যে আবদ্ধ ছিল না, বা ত্রুটি আটকাতে কোনও সম্পর্কিত ব্লক ছিল না was ব্যতিক্রম চেষ্টা ব্লকের মধ্যে থেকে ফেলে দেওয়া হয়েছে থ্রো স্টেটমেন্ট ব্যবহার করে এবং ক্যাচ স্টেটমেন্ট দিয়ে ট্রাই ব্লকের বাইরে ধরা পড়ে। "
ইউজিন কুজমেনকো

1
মাইক্রোসফ্টের সি # অবশ্যই জাভাস্ক্রিপ্টের চেয়ে ত্রুটিগুলি আরও ভালভাবে পরিচালনা করে: পি। মোজিলা ফায়ারফক্সে এর মতো কিছু যুক্ত করেছে that's যদিও এটি ইকমাস্ক্রিপ্ট স্ট্যান্ডার্ডে নেই, এমনকি ES6 নয়, তবে তারা এটিকে কীভাবে বানাতে হবে তাও ব্যাখ্যা করেছেন, যদিও এটি সাফল্য নয়। মূলত উপরের মত একই, কিন্তু ব্যবহার instanceOfএখানে
বার্ট

জাভাস্ক্রিপ্টে আপনি যা চান তা নিক্ষেপ করতে পারেন, এটি সাধারণ স্ট্রিং, একটি নম্বর (ত্রুটি কোড মনে করুন) বা পুরোপুরি যোগ্য কোনও বস্তু হোক। খুব সুন্দর!
ইব্রাহিম ব্রুকস

1
@ লুইসনেল, আপনি যদি আমার কোড উদাহরণটি সাবধানতার সাথে দেখেন তবে আপনি দেখতে পাবেন যে আমি nameকনস্ট্রাক্টর ফাংশনের সম্পত্তিটি ব্যবহার করার পরামর্শ দিচ্ছিলাম না । আমি একটি nameসম্পত্তি সঙ্গে একটি কাস্টম তৈরি বস্তু নিক্ষেপ করার পরামর্শ দিচ্ছিলাম , এটি ভাঙ্গবে না ...
সিএমএস

15

নীচের মন্তব্যে উল্লিখিত হিসাবে এটি মজিলা নির্দিষ্ট, তবে আপনি 'শর্তসাপেক্ষ ক্যাচ' ব্লক ব্যবহার করতে পারেন। উদাহরণ:

try {
  ...
  throwSpecificError();
  ...
}
catch (e if e.sender === "specific") {
  specificHandler(e);
}
catch (e if e.sender === "unspecific") {
  unspecificHandler(e);
}
catch (e) {
  // don't know what to do
  throw e;
} 

এটি জাভাতে ব্যবহৃত টাইপড ব্যতিক্রম হ্যান্ডলিংয়ের মতো আরও কিছু অনুরূপ দেয়, কমপক্ষে সিন্টেক্সিকভাবে।


সিএমএসের উত্তরের সাথে একত্রিত করুন এবং এটি নিখুঁত।
এটস গোলাল

3
শর্তসাপেক্ষ ক্যাচ এমন একটি জিনিস যা আমি হয় আগে জানতাম না বা ভুলে গিয়েছিলাম। আমাকে শিক্ষিত / স্মরণ করিয়ে দেওয়ার জন্য ধন্যবাদ! +1
এটস গোলাল

12
কেবল ফায়ারফক্স দ্বারা সমর্থিত (২.০ থেকে)। এটি অন্যান্য ব্রাউজারগুলিতেও বিশ্লেষণ করে না; আপনি কেবল সিনট্যাক্স ত্রুটি পান।
ক্রিসেন্ট টাটকা

10
হ্যাঁ, এটি মজিলা-কেবল এক্সটেনশন, এটি মানদণ্ডের জন্য প্রস্তাবিতও নয়। সিনট্যাক্স-লেভেল বৈশিষ্ট্য হওয়ায় এটার জন্য স্নিগ্ধ করার কোনও উপায় নেই এবং allyচ্ছিকভাবে এটি ব্যবহার করুন।
বোবিনস

3
অতিরিক্ত হিসাবে, প্রস্তাবিত সমাধানটি মানহীন বলে। [মোজিলার জাভাস্ক্রিপ্ট রেফারেন্সটি ফর্ম করুন [( বিকাশকারী.মোজিলা.আর.ইন.ইউএস / This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.
তথ্য

10

try-catch-finally.js

চেষ্টা-ধরা-শেষ.জেএস ব্যবহার করে , আপনি _tryএকটি বেনামে কলব্যাক দিয়ে ফাংশনটি কল করতে পারেন , যা এটি কল করবে এবং আপনি .catchনির্দিষ্ট ত্রুটিগুলি ধরার জন্য কলগুলি এবং যে .finallyকোনও উপায়ে কার্যকর করার জন্য কল করতে পারবেন।

উদাহরণ

_try(function () {
    throw 'My error';
})
.catch(Error, function (e) {
    console.log('Caught Error: ' + e);
})
.catch(String, function (e) {
    console.log('Caught String: ' + e);
})
.catch(function (e) {
    console.log('Caught other: ' + e);
})
.finally(function () {
    console.log('Error was caught explicitly');
});

আধুনিক তীর ফাংশন এবং টেম্পলেট আক্ষরিক সহ উদাহরণ

_try(() => {
  throw 'My error';
}).catch(Error, e => {
  console.log(`Caught Error: ${e}`);
}).catch(String, e => {
  console.log(`Caught String: ${e}`);
}).catch(e => {
  console.log(`Caught other: ${e}`);
}).finally(() => {
  console.log('Error was caught explicitly');
});

2

রফতানি ব্যবহারের জন্য মডিউল

/**
 * Custom InputError
 */
class InputError extends Error {
  /**
   * Create InputError
   * @param {String} message
   */
  constructor(message) {
    super(message);
    this.name = this.constructor.name;
    Error.captureStackTrace(this, this.constructor);
  }
}

/**
 * Custom AuthError
 */
class AuthError extends Error {
  /**
   * Create AuthError
   * @param {String} message
   */
  constructor(message) {
    super(message);
    this.name = this.constructor.name;
    Error.captureStackTrace(this, this.constructor);
  }
}

/**
 * Custom NotFoundError
 */
class NotFoundError extends Error {
  /**
   * Create NotFoundError
   * @param {String} message
   */
  constructor(message) {
    super(message);
    this.name = this.constructor.name;
    Error.captureStackTrace(this, this.constructor);
  }
}

module.exports = {
  InputError: InputError,
  AuthError: AuthError,
  NotFoundError: NotFoundError
};

স্ক্রিপ্টে আমদানি করুন:

const {InputError, AuthError, NotFoundError} = require(path.join(process.cwd(), 'lib', 'errors'));

ব্যবহার করুন:

function doTheCheck = () =>
  checkInputData().then(() => {
    return Promise.resolve();
  }).catch(err => {
    return Promise.reject(new InputError(err));
  });
};

বাহ্যিক কলিং কোড:

doTheCheck.then(() => {
  res.send('Ok');
}).catch(err => {
  if (err instanceof NotFoundError) {
    res.status(404).send('Not found');
  } else if (err instanceof AuthError) {
    res.status(301).send('Not allowed');
  } else if (err instanceof InputError) {
    res.status(400).send('Input invalid');
  } else {
    console.error(err.toString());
    res.status(500).send('Server error');
  }
});

0

আমি এই সমাধানগুলির কোনও পছন্দ করি নি তাই নিজের তৈরি করেছি। চেষ্টাটি-শেষের দিকে.জেগুলি খুব দুর্দান্ত তবে ব্যতীত যদি আপনি চেষ্টা করার আগে যদি কিছুটা আন্ডারস্কোর (_) ভুলে যান তবে কোডটি এখনও ঠিক ঠিক চলবে, তবে কিছুই কখনও ধরা পড়বে না! ইশ।

CatchFilter

আমি আমার কোডে একটি ক্যাচফিল্টার যুক্ত করেছি:

"use strict";

/**
 * This catches a specific error. If the error doesn't match the errorType class passed in, it is rethrown for a
 * different catch handler to handle.
 * @param errorType The class that should be caught
 * @param funcToCall The function to call if an error is thrown of this type
 * @return {Function} A function that can be given directly to the `.catch()` part of a promise.
 */
module.exports.catchOnly = function(errorType, funcToCall) {
  return (error) => {
    if(error instanceof errorType) {
      return funcToCall(error);
    } else {
      // Oops, it's not for us.
      throw error;
    }
  };
};

এখন আমি ফিল্টার করতে পারি

এখন আমি সি # বা জাভা এর মতো ফিল্টার করতে পারি:

new Promise((resolve, reject => {
   <snip><snip>
}).catch(CatchFilter.catchOnly(MyError, err =>
   console.log("This is for my error");
}).catch(err => {
   console.log("This is for all of the other errors.");
});

-2
    <li>
      <span>onWarning:</span>
      <span id="msg_warning"></span>
    </li>

  try {
  // load face detection model
  await changeFaceDetector(MTCNN)
  changeInputSize(128)

  // try to access users webcam and stream the images
  // to the video element

    const stream = await navigator.mediaDevices.getUserMedia({ video: {} })
    const videoEl = $('#inputVideo').get(0)
    videoEl.srcObject = stream
  }
  catch(err) {
    //$("#msg_error").html(`Requested device not found`);
    $("#msg_error").html(err.message);
    console.log(err.message);
  }

হাই, স্ট্যাক ওভারফ্লোতে আপনাকে স্বাগতম। ইতিমধ্যে পোস্ট করা অন্যান্য 5 টি উত্তর থেকে আপনার উত্তর কীভাবে আরও ভাল / আরও দক্ষ / ইত্যাদি?
মজুয়ারেজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.