Error
åºçº¿
广æ³å¯ç¨
*
èª 2015å¹´7æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
* æ¤ç¹æ§çæäºé¨åçæ¯æç¨åº¦å¯è½ææä¸åã
å½è¿è¡æ¶éè¯¯äº§çæ¶ï¼Error 对象ä¼è¢«æåºãError 对象ä¹å¯ç¨äºç¨æ·èªå®ä¹çå¼å¸¸çåºç¡å¯¹è±¡ãä¸é¢ååºäºåç§å
å»ºçæ åé误类åã
æè¿°
å½ä»£ç è¿è¡æ¶çåçé误ï¼ä¼å建æ°ç Error 对象ï¼å¹¶å°å
¶æåºã
é误类å
é¤äºéç¨ç Error æé 彿°å¤ï¼JavaScript è¿æå
¶ä»ç±»åçé误æé 彿°ã对äºå®¢æ·ç«¯å¼å¸¸ï¼è¯¦è§å¼å¸¸å¤çè¯å¥ã
EvalError-
å建ä¸ä¸ª error å®ä¾ï¼è¡¨ç¤ºé误çåå ï¼ä¸
eval()æå ³ã RangeError-
å建ä¸ä¸ª error å®ä¾ï¼è¡¨ç¤ºé误çåå ï¼æ°å¼åéæåæ°è¶ åºå ¶ææèå´ã
ReferenceError-
å建ä¸ä¸ª error å®ä¾ï¼è¡¨ç¤ºé误çåå ï¼æ æå¼ç¨ã
SyntaxError-
å建ä¸ä¸ª error å®ä¾ï¼è¡¨ç¤ºé误çåå ï¼è¯æ³é误ã
TypeError-
å建ä¸ä¸ª error å®ä¾ï¼è¡¨ç¤ºé误çåå ï¼åéæåæ°ä¸å±äºææç±»åã
URIError-
å建ä¸ä¸ª error å®ä¾ï¼è¡¨ç¤ºé误çåå ï¼ç»
encodeURI()ædecodeURI()ä¼ éçåæ°æ æã AggregateError-
å建ä¸ä¸ª error å®ä¾ï¼å ¶ä¸å 裹äºç±ä¸ä¸ªæä½äº§çä¸éè¦æ¥åçå¤ä¸ªé误ãå¦ï¼
Promise.any()产ççé误ã InternalError-
å建ä¸ä¸ªä»£è¡¨ Javascript 弿å é¨é误çå¼å¸¸æåºçå®ä¾ãå¦ï¼éå½å¤ªå¤ã
æé 彿°
Error()-
å建ä¸ä¸ªæ°ç
Error对象ã
éææ¹æ³
Error.captureStackTrace()-
ä¸ä¸ªéæ åç V8 彿°ï¼ç¨äºå¨ Error å®ä¾ä¸å建
stack屿§ã Error.stackTraceLimit-
ä¸ä¸ªéæ åç V8 æ°å¼å±æ§ï¼ç¨äºéå¶éè¯¯å æ è·è¸ªä¸å å«å æ 帧æ°éã
Error.prepareStackTrace()å¯é-
ä¸ä¸ªéæ åç V8 彿°ï¼å¦ææä¾äºè¿ä¸å½æ°ï¼V8 JavaScript 弿ä¼è°ç¨è¯¥å½æ°æ¥æåºå¼å¸¸ãè¿ä¸ªå½æ°å è®¸ç¨æ·æä¾èªå®ä¹çå æ è·è¸ªæ ¼å¼ã
å®ä¾å±æ§
Error.prototype.message-
éè¯¯æ¶æ¯ã对äºç¨æ·å建ç
Error对象ï¼è¿æ¯æé 彿°ç第ä¸ä¸ªåæ°æä¾çå符串ã Error.prototype.name-
é误åç§°ãè¿æ¯ç±æé 彿°å³å®çã
Error.prototype.cause-
表示导è´å½åé误被æåºçåå ââé常æ¯å¦ä¸ä¸ªé误ã对äºç¨æ·å建ç
Error对象ï¼è¿æ¯æé 彿°ç第äºä¸ªåæ°æä¾çå¼ã Error.prototype.fileName-
ä¸ä¸ªéæ åç Mozilla 屿§ï¼ç¨äºè¡¨ç¤ºå¼åæ¤é误çæä»¶çè·¯å¾ã
Error.prototype.lineNumber-
ä¸ä¸ªéæ åç Mozilla 屿§ï¼ç¨äºè¡¨ç¤ºå¼åæ¤é误çä»£ç æå¨çæä»¶çè¡å·ã
Error.prototype.columnNumber-
ä¸ä¸ªéæ åç Mozilla 屿§ï¼ç¨äºè¡¨ç¤ºå¼åæ¤é误ç代ç 卿件䏿å¨è¡çåå·ã
Error.prototype.stack-
ä¸ä¸ªéæ åç屿§ï¼ç¨äºå æ è·è¸ªã
å®ä¾æ¹æ³
Error.prototype.toString()-
è¿å表示该对象çå符串ãè¦çäº
Object.prototype.toString()æ¹æ³ã
示ä¾
>æåºä¸ä¸ªåºæ¬é误
éå¸¸ä½ ä¼ä½¿ç¨ throw å
³é®åæ¥æåºä½ å建ç Error 对象ãå¯ä»¥ä½¿ç¨ try...catch ç»ææ¥å¤çå¼å¸¸ï¼
try {
throw new Error("Whoops!");
} catch (e) {
console.error(e.name + ": " + e.message);
}
å¤çä¸ä¸ªç¹å®é误
ä½ å¯ä»¥éè¿å¤æå¼å¸¸çç±»åæ¥ç¹å®å¤çæä¸ç±»çå¼å¸¸ï¼å³å¤æ constructor 屿§ï¼å½ä½¿ç¨ç°ä»£ JavaScript 弿æ¶ï¼å¯ä½¿ç¨ instanceof å
³é®åï¼
try {
foo.bar();
} catch (e) {
if (e instanceof EvalError) {
console.error(e.name + ": " + e.message);
} else if (e instanceof RangeError) {
console.error(e.name + ": " + e.message);
}
// ... etc
else {
// If none of our cases matched leave the Error unhandled
throw e;
}
}
åºåç¸ä¼¼çé误
ææ¶ï¼å¯¹äºä»£ç åçé误éè¦æ ¹æ®å ¶åå è¿è¡ä¸åçå¤çï¼ä½é误çåå åè¾ä¸ºç¸ä¼¼ï¼ä¾å¦ï¼é误çç±»ååæ¶æ¯åç¸åï¼ã
å¦æä½ æ æ³æ§å¶åæé误çæåºï¼é£ä¹ä¸ç§æ¹æ³æ¯æè·é误ç¶åæåºä¸ä¸ªæ°çé误ï¼å¹¶å¨æ°çé误ä¸ç»åºæ´å å
·ä½çéè¯¯æ¶æ¯ãåå§é误åºè¯¥è¢«ä¼ éå°æ°ç Error çæé 彿°ç option åæ°ï¼cause 屿§ï¼ä¸ï¼è¿ç¡®ä¿äºåå§çé误åå æ 追踪信æ¯å¨ä¸å±ç try/catch åä¸å¯ç¨ã
以ä¸ç¤ºä¾å±ç¤ºäºä¸¤ç§æ¹æ³ä¼å¨å¤±è´¥æ¶æåºç¸ä¼¼çé误ï¼doFailSomeWay() å doFailAnotherWay()ï¼ï¼
function doWork() {
try {
doFailSomeWay();
} catch (err) {
throw new Error("Failed in some way", { cause: err });
}
try {
doFailAnotherWay();
} catch (err) {
throw new Error("Failed in another way", { cause: err });
}
}
try {
doWork();
} catch (err) {
switch (err.message) {
case "Failed in some way":
handleFailSomeWay(err.cause);
break;
case "Failed in another way":
handleFailAnotherWay(err.cause);
break;
}
}
夿³¨ï¼å¦æä½ å¨å建ä¸ä¸ªå½æ°åºï¼ä½ åºè¯¥ä½¿ç¨é误åå æ¥åºåä¸åçé误ââè䏿¯è¦æ±ä½ ç彿°åºç使ç¨è æ¥è§£æéè¯¯æ¶æ¯ãç¸å ³ç示ä¾ï¼è¯·åè§æä¾é误åå ã
èªå®ä¹é误类åä¹å¯ä»¥ä½¿ç¨ cause 屿§ï¼åææ¯éè¿ super() è°ç¨åç±»çæé 彿°æ¶ä¼ é options åæ°ã
class MyError extends Error {
constructor(/* some arguments */) {
// Needs to pass both `message` and `options` to install the "cause" property.
super(message, options);
}
}
èªå®ä¹é误类å
ä½ å¯è½å¸æèªå®ä¹åºäº Error çå¼å¸¸ç±»åï¼ä½¿å¾ä½ è½å¤ throw new MyError() å¹¶å¯ä»¥ä½¿ç¨ instanceof MyError æ¥æ£æ¥æä¸ªå¼å¸¸çç±»åãè¿ç§éæ±çéç¨è§£å³æ¹æ³å¦ä¸ã
åè StackOverflow ä¸å ³äºâWhat's a good way to extend Error in JavaScript?âç讨论ã
ES6 èªå®ä¹é误类
è¦åï¼Babel 7 ä¹åççæ¬å¯ä»¥å¤ç CustomError ç±»æ¹æ³ï¼ä½ç±»æ¹æ³éè¦ä½¿ç¨ Object.defineProperty() å®ä¹ãå¦åï¼æ§çæ¬ç Babel åå
¶ä»è½¬è¯å¨å¨æ²¡æé¢å¤é
ç½®çæ
åµä¸å°æ æ³æ£ç¡®å¤çä¸é¢ç代ç ã
夿³¨ï¼å¨ä½¿ç¨ ES2015 çç±»æ¶ï¼ä¸äºæµè§å¨ä¼å¨å æ è·è¸ªä¸å
å« CustomError æé 彿°ã
class CustomError extends Error {
constructor(foo = "bar", ...params) {
// Pass remaining arguments (including vendor specific ones) to parent constructor
super(...params);
// Maintains proper stack trace for where our error was thrown (only available on V8)
if (Error.captureStackTrace) {
Error.captureStackTrace(this, CustomError);
}
this.name = "CustomError";
// Custom debugging information
this.foo = foo;
this.date = new Date();
}
}
try {
throw new CustomError("baz", "bazMessage");
} catch (e) {
console.error(e.name); // CustomError
console.error(e.foo); // baz
console.error(e.message); // bazMessage
console.error(e.stack); // stacktrace
}
ES5 èªå®ä¹é误对象
è¦åï¼å¨ä½¿ç¨ååå£°ææ¶ï¼æææµè§å¨é½ä¼å¨å æ è·è¸ªä¸å
å« CustomError çæé 彿°ã
function CustomError(foo, message, fileName, lineNumber) {
var instance = new Error(message, fileName, lineNumber);
instance.foo = foo;
Object.setPrototypeOf(instance, CustomError.prototype);
if (Error.captureStackTrace) {
Error.captureStackTrace(instance, CustomError);
}
return instance;
}
Object.setPrototypeOf(CustomError.prototype, Error.prototype);
Object.setPrototypeOf(CustomError, Error);
CustomError.prototype.name = "CustomError";
try {
throw new CustomError("baz", "bazMessage");
} catch (e) {
console.error(e.name); // CustomError
console.error(e.foo); // baz
console.error(e.message); // bazMessage
}
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-error-objects> |
æµè§å¨å ¼å®¹æ§
åè§
core-js䏿ä¾äºå ·æç°ä»£è¡ä¸ºï¼å¦ï¼æ¯æcauseï¼çErrorç polyfillthrowtry...catch- å
³äº
Error.captureStackTrace()ãError.stackTraceLimitåError.prepareStackTrace()ç V8 ææ¡£ã