Error
Baseline
åºãå©ç¨å¯è½
*
ãã®æ©è½ã¯åºãå®è£ ããã¦ãããå¤ãã®ãã¼ã¸ã§ã³ã®ç«¯æ«ããã©ã¦ã¶ã¼ã§åä½ãã¾ãã2015å¹´7æä»¥éããã¹ã¦ã®ãã©ã¦ã¶ã¼ã§å©ç¨å¯è½ã§ãã
* ãã®æ©è½ã®ä¸é¨ã¯ã対å¿ã¬ãã«ãç°ãªãå ´åãããã¾ãã
Error ãªãã¸ã§ã¯ãã¯ãå®è¡æã¨ã©ã¼ãçºçããæã«çºçãã¾ãã Error ãªãã¸ã§ã¯ãã¯ãã¦ã¼ã¶ã¼å®ç¾©ã®ä¾å¤ã®åºåºãªãã¸ã§ã¯ãã¨ãã¦ä½¿ç¨ãããã¨ãã§ãã¾ããæ¨æºã®çµã¿è¾¼ã¿ã¨ã©ã¼åã«ã¤ãã¦ã¯ä¸è¨ãåç
§ãã¦ãã ããã
解説
å®è¡æã¨ã©ã¼ãçºçããã¨ãæ°ãã Error ãªãã¸ã§ã¯ããçæããã¹ãã¼ããã¾ãã
Error ã¯ã·ãªã¢ã©ã¤ãºå¯è½ãªãã¸ã§ã¯ããªã®ã§ã structuredClone() ã§è¤è£½ããããã¯ã¼ã«ã¼éã§ postMessage() ã使ç¨ãã¦ã³ãã¼ããããããã¨ãã§ãã¾ãã
ã¨ã©ã¼ã®å
JavaScript ã«ã¯ãä¸è¬ç㪠Error ã³ã³ã¹ãã©ã¯ã¿ã¼ã®ä»ã«ã䏿 ¸ã¨ãªãä»ã®ã¨ã©ã¼ã³ã³ã¹ãã©ã¯ã¿ã¼ãããã¾ããã¯ã©ã¤ã¢ã³ãå´ã®ä¾å¤ã«ã¤ãã¦ã¯ãä¾å¤å¦çæãåç
§ãã¦ãã ããã
EvalError-
ã°ãã¼ãã«é¢æ°
eval()ã«é¢ãã¦çºçããã¨ã©ã¼ã表ãã¤ã³ã¹ã¿ã³ã¹ãçæãã¾ãã RangeError-
æ°å¤å¤æ°ã¾ãã¯å¼æ°ãããã®æå¹ç¯å²å¤ã§ããå ´åã«çºçããã¨ã©ã¼ã表ãã¤ã³ã¹ã¿ã³ã¹ãçæãã¾ãã
ReferenceError-
䏿£ãªåç §ããåç §å ã®å¤ãåå¾ããæã«çºçããã¨ã©ã¼ã表ãã¤ã³ã¹ã¿ã³ã¹ãçæãã¾ãã
SyntaxError-
æ§æã¨ã©ã¼ã表ãã¤ã³ã¹ã¿ã³ã¹ãçæãã¾ãã
TypeError-
夿°ã¾ãã¯å¼æ°ã®åãæå¹ã§ãªãå ´åã«çºçããã¨ã©ã¼ã表ãã¤ã³ã¹ã¿ã³ã¹ãçæãã¾ãã
URIError-
encodeURI()ã¾ãã¯decodeURI()ã«ä¸æ£ãªå¼æ°ã渡ãããæã«çºçããã¨ã©ã¼ã表ãã¤ã³ã¹ã¿ã³ã¹ãçæãã¾ãã AggregateError-
å¦çããè¤æ°ã®ã¨ã©ã¼ãå ±åããå¿ è¦ãããå ´åï¼ä¾ãã°
Promise.any()ï¼ã«è¤æ°ã®ã¨ã©ã¼ãåä¸ã®ãªãã¸ã§ã¯ãã¨ãã¦è¡¨ç¾ããã¤ã³ã¹ã¿ã³ã¹ãçæãã¾ãã InternalError-
"too much recursion" (æ·±ãããå帰) ãªã©ãJavaScript ã¨ã³ã¸ã³ã§å é¨ã¨ã©ã¼ãçºçããæã«çºçããã¨ã©ã¼ã表ãã¤ã³ã¹ã¿ã³ã¹ãçæãã¾ãã
ã³ã³ã¹ãã©ã¯ã¿ã¼
Error()-
æ°ãã
Errorãªãã¸ã§ã¯ããçæãã¾ãã
éçããããã£
Error.stackTraceLimit-
æ¨æºå¤ã®æ°å¤ããããã£ã§ãã¨ã©ã¼ã¹ã¿ãã¯ãã¬ã¼ã¹ã«å«ããã¹ã¿ãã¯ãã¬ã¼ã ã®æ°ãå¶éãã¾ãã
éçã¡ã½ãã
Error.captureStackTrace()-
æ¨æºå¤ã®é¢æ°ã§ãæå®ããããªãã¸ã§ã¯ãã«
stackããããã£ãçæãã¾ãã Error.isError()-
弿°ãã¨ã©ã¼ãªãã°
trueãè¿ãããã以å¤ãªãã°falseãè¿ãã¾ãã Error.prepareStackTrace()çç¥å¯-
æ¨æºå¤ã®é¢æ°ã§ãçºçããä¾å¤ã«å¯¾ã㦠JavaScript ã¨ã³ã¸ã³ã«ãã£ã¦å¼ã³åºãããã¦ã¼ã¶ã¼ãã¹ã¿ãã¯ãã¬ã¼ã¹ãç¬èªã«æ¸å¼åãããã¨ãã§ããããã«ãã¾ãã詳ãã㯠V8 Stack Trace API ã®ããã¥ã¡ã³ããåç §ãã¦ãã ããã
ã¤ã³ã¹ã¿ã³ã¹ããããã£
ãããã®ããããã£ã¯ Error.prototype ã§å®ç¾©ããã¦ããããã¹ã¦ã® Error ã¤ã³ã¹ã¿ã³ã¹ã§å
±æããã¾ãã
Error.prototype.constructor-
ãã®ã¤ã³ã¹ã¿ã³ã¹ãªãã¸ã§ã¯ãã使ããã³ã³ã¹ãã©ã¯ã¿ã¼é¢æ°ã§ãã
Errorã¤ã³ã¹ã¿ã³ã¹ã®å ´åãåæå¤ã¯Errorã³ã³ã¹ãã©ã¯ã¿ã¼ã§ãã Error.prototype.name-
ã¨ã©ã¼ã®åç§°ã表ãã¾ãã
Error.prototype.nameã®å ´åãåæå¤ã¯"Error"ã§ããTypeErrorãSyntaxErrorã®ãããªãµãã¯ã©ã¹ã¯åèªã®nameããããã£ãæä¾ãã¾ãã Error.prototype.stack-
ã¹ã¿ãã¯ãã¬ã¼ã¹ã®ããã®æ¨æºå¤ã®ããããã£ã§ãã
ãããã®ããããã£ã¯ããããã® Error ã¤ã³ã¹ã¿ã³ã¹èªèº«ã®ããããã£ã§ãã
cause-
ç¾å¨ã®ã¨ã©ã¼ããªãçºçããã®ãã示ãã¨ã©ã¼ã®åå ãéå¸¸ã¯ææããå¥ã®ã¨ã©ã¼ãã¦ã¼ã¶ã¼ãçæãã
Errorãªãã¸ã§ã¯ãã§ã¯ãã³ã³ã¹ãã©ã¯ã¿ã¼ã®ç¬¬äºå¼æ°ã§causeããããã£ã¨ãã¦æ¸¡ãããå¤ã§ããã columnNumber-
æ¨æºå¤ã® Mozilla ã®ããããã£ã§ããã®ã¨ã©ã¼ãçºçããè¡å ã®æ¡çªå·ã§ãã
fileName-
æ¨æºå¤ã® Mozilla ã®ããããã£ã§ããã®ã¨ã©ã¼ãçºçãããã¡ã¤ã«ã¸ã®ãã¹ã§ãã
lineNumber-
æ¨æºå¤ã® Mozilla ã®ããããã£ã§ããã®ã¨ã©ã¼ãçºçãããã¡ã¤ã«å ã®è¡çªå·ã§ãã
message-
ã¨ã©ã¼ã¡ãã»ã¼ã¸ãã¦ã¼ã¶ã¼ã使ãã
Errorãªãã¸ã§ã¯ãã®å ´åãããã¯ã³ã³ã¹ãã©ã¯ã¿ã¼ã®æåã®å¼æ°ã¨ãã¦æ¸¡ãããæååã§ãã
ã¤ã³ã¹ã¿ã³ã¹ã¡ã½ãã
Error.prototype.toString()-
æå®ãããªãã¸ã§ã¯ãã表ãæååãè¿ãã¾ãã
Object.prototype.toString()ã¡ã½ããã䏿¸ããã¾ãã
ä¾
>ä¸è¬çãªã¨ã©ã¼ãçºçããã
é常ã Error ãªãã¸ã§ã¯ã㯠throw ãã¼ã¯ã¼ãã使ã£ã¦æå³çã«ã¨ã©ã¼ãçºçãããããã«ä½æãã¾ãã try...catch æ§æã使ç¨ãã¦ã¨ã©ã¼ãå¦çãã¦ãã ããã
try {
throw new Error("Whoops!");
} catch (e) {
console.error(`${e.name}: ${e.message}`);
}
ç¹å®ã®ã¨ã©ã¼ãå¦çãã
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}`);
}
// ãªã©
else {
// ã©ãã«ãä¸è´ããªãå ´åãError ãæªå¦çã®ã¾ã¾ã¨ãã
throw e;
}
}
é¡ä¼¼ããã¨ã©ã¼ã¨åºå¥ãã
ç°ãªã対å¦ãå¿ è¦ãªåå ã§å¤±æããã«ãããããããã³ã¼ããããã¯ãé常ã«ããä¼¼ãã¨ã©ã¼ï¼ããªãã¡åãåãã¡ãã»ã¼ã¸ï¼ãæãããã¨ãããã¾ãã
çºçããå
ã®ã¨ã©ã¼ã管çä¸ã«ãªãå ´åãã¨ã©ã¼ãææãã¦ãã詳細ãªã¡ãã»ã¼ã¸ãæã¤æ°ãã Error ãªãã¸ã§ã¯ããæãããã¨ãä¸ã¤ã®é¸æè¢ã¨ãªãã¾ãã
å
ã®ã¨ã©ã¼ã¯æ°ãã Error ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ã® options ãã©ã¡ã¼ã¿ã¼ã® cause ããããã£ã«æ¸¡ãã¹ãã§ããããã«ãã£ã¦ãä¸ä½ã® try/catch ãããã¯ãå
ã®ã¨ã©ã¼ã¨ã¹ã¿ãã¯ãã¬ã¼ã¹ãå©ç¨ã§ãããã¨ãä¿è¨¼ãã¾ãã
以ä¸ã®ä¾ã¯ãä¼¼ãã¨ã©ã¼ã§å¤±æãã 2 ã¤ã®ã¡ã½ããã示ãã¦ãã¾ãï¼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;
}
}
ã¡ã¢: ããããªããã©ã¤ãã©ãªã¼ãå¶ä½ãã¦ãããªããå©ç¨è ã«ã¨ã©ã¼ã¡ãã»ã¼ã¸ãè§£æãããããé¡ãããããããçºçããã¨ã©ã¼ãåºå¥ããããã« Error ã® cause ã使ç¨ãã¹ãã§ããä¾ã«ã¤ãã¦ã¯ã¨ã©ã¼ã® cause ãã¼ã¸ãåç §ãã¦ãã ããã
ãµãã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ã super() ãå¼ã³åºãã¨ãã« options ãã©ã¡ã¼ã¿ã¼ã渡ãã°ãç¬èªã®ã¨ã©ã¼åã cause ããããã£ãå©ç¨ã§ãã¾ããåºåºã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ Error() 㯠options.cause ãèªã¿åã£ã¦ãæ°ããã¨ã©ã¼ã®ã¤ã³ã¹ã¿ã³ã¹ã« cause ããããã£ãå®ç¾©ãã¾ãã
class MyError extends Error {
constructor(message, options) {
// "cause" ããããã£ãè¨å®ããããã«ç¬¬äºå¼æ°ã« `options` ãæ¸¡ãå¿
è¦ãããã
super(message, options);
}
}
console.log(new MyError("test", { cause: new Error("cause") }).cause);
// Error: cause
ç¬èªã®ã¨ã©ã¼å
Error ããæ´¾çããç¬èªã®ã¨ã©ã¼åãå®ç¾©ã㦠throw new MyError() ãã§ããããã«ããinstanceof MyError ã§ä¾å¤ãã³ãã©ã¼å
ã®ã¨ã©ã¼ã®ç¨®é¡ã確èªãããã§ãããããããè¡ãä¸è¬çãªæ¹æ³ã®å®ä¾ã以ä¸ã«ç¤ºãã¾ãã
Stack Overflow ã®çªã£è¾¼ãã è°è«ã "What's a good way to extend Error in JavaScript?" ãåç §ãã¦ãã ããã
è¦å:
çµã¿è¾¼ã¿ã®ãµãã¯ã©ã¹åã¯ãES6 ããå¤ãã³ã¼ãã«ç¢ºå®ã«ãã©ã³ã¹ãã¤ã«ã§ããããã§ã¯ããã¾ããããªããªãã Reflect.construct() ã使ããã«ç¹å®ã® new.target ãæã¤åºåºã¯ã©ã¹ãæ§ç¯ããææ®µããªãããã§ãã追å ã®è¨å®ãè¡ãããã³ã³ã¹ãã©ã¯ã¿ã¼ã®æå¾ã§ Object.setPrototypeOf(this, CustomError.prototype) ãæåã§å¼ã¶å¿
è¦ãããã¾ããããããªãã¨ãæ§ç¯ãããã¤ã³ã¹ã¿ã³ã¹ã¯ CustomError ã®ã¤ã³ã¹ã¿ã³ã¹ã«ãªãã¾ããã詳ãã㯠the TypeScript FAQ ãã覧ãã ããã
ã¡ã¢:
ES2015 ã¯ã©ã¹ã使ç¨ããå ´åãä¸é¨ã®ãã©ã¦ã¶ã¼ã¯ã¹ã¿ãã¯ãã¬ã¼ã¹ä¸ã« CustomError ã³ã³ã¹ãã©ã¯ã¿ã¼ãå«ãã¾ãã
class CustomError extends Error {
constructor(foo = "bar", ...params) {
// 親ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ã«ï¼ãã³ãã¼åºæã®ãã®ãå«ãã¦ï¼æ®ãã®å¼æ°ã渡ã
super(...params);
// ã¨ã©ã¼ãçºçããç®æã®æ£ããã¹ã¿ãã¯ãã¬ã¼ã¹ãç¶æãã ï¼V8ã§ã®ã¿æå¹ï¼
if (Error.captureStackTrace) {
Error.captureStackTrace(this, CustomError);
}
this.name = "CustomError";
// ã«ã¹ã¿ã ã®ãããã°æ
å ±
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); // stack trace
}
仿§æ¸
| 仿§æ¸ |
|---|
| ECMAScript® 2027 Language Specification > # sec-error-objects > |