दिलचस्प पोस्ट
एक नकारात्मक बदलाव संख्या के साथ वाम स्थानांतरण AJAX अनुरोधों में सापेक्ष URL खोज में कई कीवर्ड हाइलाइट करें ऑब्जेक्ट शाब्दिक घोषणाओं में स्व-संदर्भ क्या प्रतीक है ^ बैच लिपि में इसका मतलब है एंट या मेवेन के बजाय ग्रेडल का उपयोग क्यों करें? मजबूत / कमजोर / बनाए रखा / असुरक्षित / उलटा हुआ / असाइन करें एसोसिएशन की गिनती की स्थिति पर 3 प्रश्नों को रेखांकित करता है डेल्फी 2009 में TMemoryStream को 'स्ट्रिंग' में परिवर्तित करना पावरहेल में "@" प्रतीक क्या करता है? जीमेल एसएमटीपी सर्वर का उपयोग करते समय से पता बदलने के लिए एडीबी जवाब नहीं दे रहा है आप अधिक इंतजार कर सकते हैं, या मैन्युअल रूप से "adb.exe" प्रक्रिया को मार सकते हैं और 'पुनः आरंभ' पर क्लिक कर सकते हैं SQL सर्वर से डेटाबेस की सूची प्राप्त करें स्वचालित रूप से GitHub से पुश पर सर्वर पर तैनात Homebrew + मैक ओएस एक्स 10.8 पर पायथन: घातक पायथन त्रुटि: PyThreadState_Get: कोई वर्तमान थ्रेड आयात करने वाले मैपनिक

ईएस 6 वाक्यविन्यास और बैबल के साथ जावास्क्रिप्ट में त्रुटि को बढ़ाते हुए

मैं ES6 और Babel के साथ त्रुटि का विस्तार करने की कोशिश कर रहा हूँ यह काम नहीं कर रहा है

class MyError extends Error { constructor(m) { super(m); } } var error = new Error("ll"); var myerror = new MyError("ll"); console.log(error.message) //shows up correctly console.log(myerror.message) //shows empty string 

त्रुटि ऑब्जेक्ट को सही संदेश सेट कभी नहीं मिला।

बैबल REPL में प्रयास करें

अब मैंने कुछ समाधान SO को देखा है ( उदाहरण के लिए यहाँ ), लेकिन वे सभी बहुत ही गैर ES6-y लगते हैं। यह कैसे एक अच्छा, ES6 तरह में करने के लिए? (यह बाबेल में काम कर रहा है)

Solutions Collecting From Web of "ईएस 6 वाक्यविन्यास और बैबल के साथ जावास्क्रिप्ट में त्रुटि को बढ़ाते हुए"

करेल Bílek के जवाब के आधार पर, मैं निर्माता के लिए एक छोटा सा बदलाव करूंगा:

 class ExtendableError extends Error { constructor(message) { super(message); this.name = this.constructor.name; if (typeof Error.captureStackTrace === 'function') { Error.captureStackTrace(this, this.constructor); } else { this.stack = (new Error(message)).stack; } } } // now I can extend class MyError extends ExtendableError {} var myerror = new MyError("ll"); console.log(myerror.message); console.log(myerror instanceof Error); console.log(myerror.name); console.log(myerror.stack); 

इससे MyError को स्टैक में प्रिंट किया जाएगा, और सामान्य Error

यह स्टैक ट्रेस पर त्रुटि संदेश भी जोड़ देगा – जो केरल के उदाहरण से गायब था।

यह captureStackTrace भी उपयोग करेगा यदि यह उपलब्ध है

बैबेल 6 के साथ, आपको काम करने के लिए ट्रांसफॉर्म-बिल्टिन-विस्तार ( एनपीएम ) की आवश्यकता होती है।

इस उत्तर का मेल है, यह उत्तर और इस कोड , मैंने यह छोटा "सहायक" वर्ग बना दिया है, जो ठीक काम करता है।

 class ExtendableError extends Error { constructor(message) { super(); this.message = message; this.stack = (new Error()).stack; this.name = this.constructor.name; } } // now I can extend class MyError extends ExtendableError { constructor(m) { super(m); } } var myerror = new MyError("ll"); console.log(myerror.message); console.log(myerror instanceof Error); console.log(myerror.name); console.log(myerror.stack); 

आरईपीएल में प्रयास करें

आखिरकार इसे आराम करने के लिए बैबल 6 में यह स्पष्ट है कि डेवलपर्स इन तक पहुंचने से समर्थन नहीं करते हैं । यद्यपि यह चाल Map , Set आदि जैसी चीजों के साथ मदद नहीं करेगा । यह Error लिए काम करता है। यह एक ऐसी भाषा के प्रमुख विचारों के रूप में महत्वपूर्ण है जो एक अपवाद फेंक सकता है कस्टम त्रुटियों की अनुमति देने के लिए है यह दोगुना महत्वपूर्ण है क्योंकि वादा अधिक उपयोगी हो जाते हैं क्योंकि वे एक त्रुटि को अस्वीकार करने के लिए डिज़ाइन किए जाते हैं।

दुखद सच्चाई यह है कि आपको ES2015 में अभी भी इसे करने की ज़रूरत है।

बैबल REPL में उदाहरण

कस्टम त्रुटि पैटर्न

 class MyError { constructor(message) { this.name = 'MyError'; this.message = message; this.stack = new Error().stack; // Optional } } MyError.prototype = Object.create(Error.prototype); 

दूसरी तरफ, यह अनुमति देने के लिए बेबेल 6 के लिए प्लगइन है।

https://www.npmjs.com/package/babel-plugin-transform-builtin-extend

अद्यतन: (2016-09-29 के अनुसार) कुछ परीक्षण के बाद ऐसा प्रतीत होता है कि बैबल.ओ सभी अभिक्रियाओं (कस्टम विस्तारित त्रुटि से विस्तार) के लिए ठीक से खाता नहीं है। लेकिन एम्बर में। जेएस का विस्तार त्रुटि की अपेक्षा के अनुरूप होता है: https://ember-widdle.com/d88555a6f408174df0a4c8e0fd6b27ce

संपादित करें : टाइपस्क्रिप्ट 2.1 में परिवर्तन तोड़ते हैं

बिल्ट-इन जैसे त्रुटि, सरणी, और मानचित्र बढ़ाना अब काम नहीं कर सकता है

एक सिफारिश के रूप में, आप किसी भी सुपर (…) कॉल्स के तुरंत बाद प्रोटोटाइप मैन्युअल रूप से समायोजित कर सकते हैं।

संपादन ली बेन्सन मूल उत्तर मेरे लिए थोड़ा सा काम करता है यह उदाहरण के लिए ExtendableError और ExtendableError क्लास के अतिरिक्त तरीकों को भी जोड़ता है।

 class ExtendableError extends Error { constructor(message) { super(message); Object.setPrototypeOf(this, ExtendableError.prototype); this.name = this.constructor.name; } dump() { return { message: this.message, stack: this.stack } } } class MyError extends ExtendableError {} var myerror = new MyError("ll"); console.log(myerror.message); console.log(myerror.dump()); console.log(myerror instanceof Error); console.log(myerror.name); console.log(myerror.stack); 

का हवाला देते हुए

 class MyError extends Error { constructor(message) { super(message); this.message = message; this.name = 'MyError'; } } 

इस के लिए कोई ज़रूरत नहीं है। this.stack = (new Error()).stack; धन्यवाद super() कॉल करने के लिए धन्यवाद

यद्यपि उपरोक्त कोड स्टैक ट्रेस को आउटपुट नहीं कर सकता है, जब तक कि this.stack = (new Error()).stack; या Error.captureStackTrace(this, this.constructor.name); बैबल में लगाया जाता है आईएमओ, यह शायद यहां एक मुद्दा है।

दरअसल, स्टैक ट्रेस Chrome console और Node.js v4.2.1 तहत इस कोड स्निपेट्स के साथ आउटपुट हो सकता है।

 class MyError extends Error{ constructor(msg) { super(msg); this.message = msg; this.name = 'MyError'; } }; var myerr = new MyError("test"); console.log(myerr.stack); console.log(myerr); 

Chrome console का आउटपुट

 MyError: test at MyError (<anonymous>:3:28) at <anonymous>:12:19 at Object.InjectedScript._evaluateOn (<anonymous>:875:140) at Object.InjectedScript._evaluateAndWrap (<anonymous>:808:34) at Object.InjectedScript.evaluate (<anonymous>:664:21) 

Node.js आउटपुट

 MyError: test at MyError (/home/bsadmin/test/test.js:5:8) at Object.<anonymous> (/home/bsadmin/test/test.js:11:13) at Module._compile (module.js:435:26) at Object.Module._extensions..js (module.js:442:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:311:12) at Function.Module.runMain (module.js:467:10) at startup (node.js:134:18) at node.js:961:3 

@ Zangw उत्तर के अतिरिक्त, आप इस तरह अपनी त्रुटियों को परिभाषित कर सकते हैं:

 'use strict'; class UserError extends Error { constructor(msg) { super(msg); this.name = this.constructor.name; } } // define errors class MyError extends UserError {} class MyOtherError extends UserError {} console.log(new MyError instanceof Error); // true throw new MyError('My message'); 

जो सही नाम, संदेश और स्टैकट्र्रेस फेंकता है:

 MyError: My message at UserError (/Users/honzicek/Projects/api/temp.js:5:10) at MyError (/Users/honzicek/Projects/api/temp.js:10:1) at Object.<anonymous> (/Users/honzicek/Projects/api/temp.js:14:7) at Module._compile (module.js:434:26) at Object.Module._extensions..js (module.js:452:10) at Module.load (module.js:355:32) at Function.Module._load (module.js:310:12) at Function.Module.runMain (module.js:475:10) at startup (node.js:117:18) at node.js:951:3 

मैं ES6 के साथ त्रुटि का विस्तार करने की कोशिश कर रहा हूँ

वह class MyError extends Error {…} करता है वाक्यविन्यास सही है।

सूचना है कि पारस्परिक क्रियाओं को अभी भी अंतर्निहित ऑब्जेक्ट से विरासत में लाने में समस्या है। आपके मामले में,

 var err = super(m); Object.assign(this, err); 

समस्या को ठीक करने के लिए लगता है

यह देखते हुए स्वीकार किए जाते हैं जवाब अब काम नहीं करता है कि आप हमेशा एक वैकल्पिक ( repl ) के रूप में फ़ैक्टरी का उपयोग कर सकते हैं:

 function ErrorFactory(name) { return class AppError extends Error { constructor(message) { super(message); this.name = name; this.message = message; if (typeof Error.captureStackTrace === 'function') { Error.captureStackTrace(this, this.constructor); } else { this.stack = (new Error(message)).stack; } } } } // now I can extend const MyError = ErrorFactory("MyError"); var myerror = new MyError("ll"); console.log(myerror.message); console.log(myerror instanceof Error); console.log(myerror.name); console.log(myerror.stack); 

बैबेल 6 में नवीनतम बदलावों के साथ, मुझे पता चलता है कि रूपांतरण-निर्मित-विस्तार अब काम नहीं कर रहा है। अंत में मैंने इस मिश्रित दृष्टिकोण का उपयोग किया:

 export default class MyError { constructor (message) { this.name = this.constructor.name; this.message = message; this.stack = (new Error(message)).stack; } } MyError.prototype = Object.create(Error.prototype); MyError.prototype.constructor = MyError; 

तथा

 import MyError from './MyError'; export default class MyChildError extends MyError { constructor (message) { super(message); } } 

नतीजतन इन सभी परीक्षण पास:

 const sut = new MyError('error message'); expect(sut.message).toBe('error message'); expect(sut).toBeInstanceOf(Error); expect(sut).toBeInstanceOf(MyError); expect(sut.name).toBe('MyError'); expect(typeof sut.stack).toBe('string'); const sut = new MyChildError('error message'); expect(sut.message).toBe('error message'); expect(sut).toBeInstanceOf(Error); expect(sut).toBeInstanceOf(MyError); expect(sut).toBeInstanceOf(MyChildError); expect(sut.name).toBe('MyChildError'); expect(typeof sut.stack).toBe('string'); 

@ सुचिमा का उल्लेख करते हुए, आप देशी जेएस को विस्तारित नहीं कर सकते। ओपी के सवाल का उत्तर नहीं दिया जा सकता है।

मेलबर्न 29 9 1 के उत्तर के समान, मैंने एक कारखाना का उपयोग किया, लेकिन ग्राहक त्रुटि प्रकारों के लिए एमडीएन की सिफारिशों का पालन ​​किया।

 function extendError(className){ function CustomError(message){ this.name = className; this.message = message; this.stack = new Error().stack; // Optional } CustomError.prototype = Object.create(Error.prototype); CustomError.prototype.constructor = CustomError; return CustomError; }