рд░рд┐рд▓реАрдЬрд╝ 3.23.2 рдореЗрдВ, рдирдИ рд╕реБрд╡рд┐рдзрд╛ "рд╕реЗрдВрд╕рд┐рдмрд▓ рдиреЙрди-рдПрд░рд░ рдПрдХреНрд╕реЗрдкреНрд╢рди рд╕реАрд░рд┐рдПрд▓рд╛рдЗрдЬрд╝рд░" (#1253), рдЬреЛ es6-error
(https://www.npmjs.com/package/es6-error) рдХреЗ рд╕рд╛рде рдХреА рдЧрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреА рд╣реИред рддреНрд░реБрдЯрд┐ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдПред
рдЗрд╕реЗ рдЗрд╕ рд▓рд╛рдЗрди рдореЗрдВ captureException
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ:
options = this._getCaptureExceptionOptionsFromPlainObject(options, ex);
рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрд░рд╛ рдХреЛрдб рдпрд╣рд╛рдВ рд╣реИ:
import ExtendableError from 'es6-error'
class CustomError extends ExtendableError {
constructor(code, message) {
super(message)
this.name ='CustomError'
this.code = code
}
}
export default CustomError
рдлрд┐рд░ рдХреЛрдб рдореЗрдВ:
Raven.captureException(new CustomError('code123', 'not working'));
// this will cause the error message to be "Non-Error exception captured with keys: code"
рдпрд╣ рдЬреЗрдПрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред
рдЬрдм рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
import ExtendableError from 'es6-error'
class CustomError extends ExtendableError {
constructor(code, message) {
super(message)
this.name ='CustomError'
this.code = code
}
}
function isPlainObject(what) {
return Object.prototype.toString.call(what) === '[object Object]';
}
function isError(value) {
switch ({}.toString.call(value)) {
case '[object Error]':
return true;
case '[object Exception]':
return true;
case '[object DOMException]':
return true;
default:
return value instanceof Error;
}
}
function isErrorEvent(value) {
return Object.prototype.toString.call(value) === '[object ErrorEvent]';
}
var ex = new CustomError('code123', 'not working');
console.log('isPlainObject:', isPlainObject(ex))
console.log('isError:', isError(ex))
console.log('isErrorEvent:', isErrorEvent(ex))
рдпрд╣ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ true/true/false
рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдЧрд╛ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рдЖрдк рдХреЛрдб рдХреЗ рд╕рд╛рде import
рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗ
class ExtendableError extends Error {
constructor(message = '') {
super(message);
// extending Error is weird and does not propagate `message`
Object.defineProperty(this, 'message', {
configurable: true,
enumerable : false,
value : message,
writable : true,
});
Object.defineProperty(this, 'name', {
configurable: true,
enumerable : false,
value : this.constructor.name,
writable : true,
});
if (Error.hasOwnProperty('captureStackTrace')) {
Error.captureStackTrace(this, this.constructor);
return;
}
Object.defineProperty(this, 'stack', {
configurable: true,
enumerable : false,
value : (new Error(message)).stack,
writable : true,
});
}
}
рдпрд╣ false/true/false
рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдЧрд╛ред
рдореИрдВ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ рдФрд░ рдЕрдЧрд░ рдореИрдВ рдЗрд╕рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рдкрд╛рдКрдВрдЧрд╛, рддреЛ рд╣рдо рдкрд╣рд▓реЗ isError
рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рд╕реНрд╡реИрдк рдХрд░реЗрдВрдЧреЗред
@zivl рдЬрдм рдЖрдк рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЕрдкрдиреА custom-error.js
рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ "рдЬреИрд╕рд╛ рд╣реИ" рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдмреИрдмреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реАрдХрдВрдкрд╛рдЗрд▓ рдХрд░рддрд╛ рд╣реИред
Sooo рдпрд╣ "рдереЛрдбрд╝реЗ" рддреНрд░реБрдЯрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВред рдпрд╣ рдПрдХ рд╕рд╛рджрд╛ рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЧреБрдгреЛрдВ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрддреА рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ prototype
рдХреЛ Error
рдкрд░ рд╣реА рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЪреЗрдХ рдСрд░реНрдбрд░ рдмрджрд▓рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ "рд╢реНрд░реЛрдбрд┐рдВрдЧрд░ рддреНрд░реБрдЯрд┐" рдЬреИрд╕рд╛ рд╣реИред рдпрд╣ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реИ рдФрд░ рдирд╣реАрдВ рд╣реИред
@zivl 3.23.3
рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ред рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
@zivl рдЬрдм рдЖрдк рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЕрдкрдиреА
custom-error.js
рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИредрдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ "рдЬреИрд╕рд╛ рд╣реИ" рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдмреИрдмреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реАрдХрдВрдкрд╛рдЗрд▓ рдХрд░рддрд╛ рд╣реИред
Sooo рдпрд╣ "рдереЛрдбрд╝реЗ" рддреНрд░реБрдЯрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВред рдпрд╣ рдПрдХ рд╕рд╛рджрд╛ рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЧреБрдгреЛрдВ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрддреА рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ
prototype
рдХреЛError
рдкрд░ рд╣реА рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредрджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЪреЗрдХ рдСрд░реНрдбрд░ рдмрджрд▓рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ "рд╢реНрд░реЛрдбрд┐рдВрдЧрд░ рддреНрд░реБрдЯрд┐" рдЬреИрд╕рд╛ рд╣реИред рдпрд╣ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реИ рдФрд░ рдирд╣реАрдВ рд╣реИред