ã©ããªã«æã ã®ããã°ã©ãã³ã°ãç´ æ´ãããã¦ããã¹ã¯ãªãããã¨ã©ã¼ã«ãªããã¨ã¯ããã¾ããããã¯ãã¹ãäºæããªãã¦ã¼ã¶å ¥åãééã£ããµã¼ãã¬ã¹ãã³ã¹ããã®ä»å¤ãã®çç±ã«ããçºçããå¯è½æ§ãããã¾ãã
é常ãã¨ã©ã¼ãçºçããã¨ã¹ã¯ãªããã¯ âæ»â (峿ã«åæ¢) ã«ããããã³ã³ã½ã¼ã«ã«åºåãã¾ãã
ããããã¨ã©ã¼ã âãã£ããâ ããæ»ã¬ä»£ããã«ããæå³ã®ãããã¨ãããæ§ææ§é try..catch ãããã¾ãã
âtryâ¦catchâ æ§æ
try..catch æ§é ã¯2ã¤ã®ã¡ã¤ã³ãããã¯ãæã£ã¦ãã¾ã: try 㨠catch ã§ãã:
try {
// code...
} catch (err) {
// error handling
}
ããã¯æ¬¡ã®ããã«åä½ãã¾ã:
- ã¾ãã
try {...}ã®ã³ã¼ããå®è¡ããã¾ãã - ã¨ã©ã¼ããªããã°ã
catch(err)ã¯ç¡è¦ããã¾ã: å®è¡ãtryã®æå¾ã«å°éããå¾ãcatchãé£ã³è¶ãã¾ãã - ã¨ã©ã¼ãçºçããå ´åã
tryã®å®è¡ã忢ããã³ã³ããã¼ã«ããã¼ã¯catch(err)ã®å é ã«ãªãã¾ããerr夿°(ä»»æã®ååã使ãã¾ã)ã¯çºçããäºè±¡ã«é¢ãã詳細ããã¤ã¨ã©ã¼ãªãã¸ã§ã¯ããå«ãã§ãã¾ãã
å¾ã£ã¦ãtry {â¦} ãããã¯ã®å
å´ã®ã¨ã©ã¼ã¯ã¹ã¯ãªãããæ®ºãã¾ãã: catch ã®ä¸ã§ãããæ±ãæ©ä¼ãæã¦ã¾ãã
ããã¤ãä¾ãè¦ã¦ã¿ã¾ãããã
-
ã¨ã©ã¼ãªãã®ä¾:
alert(1)ã¨(2)ã表示ãã¾ã:try { alert('Start of try runs'); // (1) <-- // ...ããã§ã¯ã¨ã©ã¼ã¯ããã¾ãã alert('End of try runs'); // (2) <-- } catch(err) { alert('Catch is ignored, because there are no errors'); // (3) } -
ã¨ã©ã¼ã®ä¾:
(1)ã¨(3)ã表示ãã¾ã:try { alert('Start of try runs'); // (1) <-- lalala; // ã¨ã©ã¼, 夿°ã¯å®£è¨ããã¦ãã¾ãã! alert('End of try (never reached)'); // (2) } catch(err) { alert(`Error has occured!`); // (3) <-- }
try..catch ã¯å®è¡æã¨ã©ã¼ã«ã®ã¿ä½ç¨ãã¾ãtry..catch ãåä½ãããããã«ãã³ã¼ãã¯å®è¡å¯è½ã§ãªããã°ãªãã¾ãããã¤ã¾ããæå¹ãªJavaScriptã§ããå¿
è¦ãããã¾ãã
ããã³ã¼ããæ§æçã«èª¤ã£ã¦ããå ´åã«ã¯åä½ãã¾ãããä¾ãã°æ¬¡ã¯è§æ¬å¼§ã®ä¸ä¸è´ã§ã:
try {
{{{{{{{{{{{{
} catch(e) {
alert("The engine can't understand this code, it's invalid");
}
JavaScriptã¨ã³ã¸ã³ã¯æåã«ã³ã¼ããèªã¿ã次ã«ãããå®è¡ãã¾ããèªã¿è¾¼ã¿ã®ãã§ã¼ãºã§çºçããã¨ã©ã¼ã¯ âè§£ææé(parse-time)â ã¨ã©ã¼ã¨å¼ã°ããå復ä¸è½ã§ã(ã³ã¼ãã®å é¨ããã¯)ããªããªããã¨ã³ã¸ã³ã¯ãã®ã³ã¼ããçè§£ãããã¨ãã§ããªãããã§ãã
ãã®ãããtry..catch ã¯æå¹ãªã³ã¼ãã®ä¸ã§èµ·ããã¨ã©ã¼ã®ã¿ãæ±ããã¨ãã§ãã¾ãããã®ãããªã¨ã©ã¼ã¯ âã©ã³ã¿ã¤ã ã¨ã©ã¼â ã¾ã㯠âä¾å¤â ã¨å¼ã°ãã¾ãã
try..catch ã¯åæçã«åä½ãã¾ããã setTimeout ã®ä¸ã®ãã㪠âã¹ã±ã¸ã¥ã¼ã«ãããâ ã³ã¼ãã§ä¾å¤ãçºçããå ´åãtry..catch ã¯ããããã£ãããã¾ããã:
try {
setTimeout(function() {
noSuchVariable; // ã¹ã¯ãªããã¯ããã§æ»ã«ã¾ã
}, 1000);
} catch (e) {
alert( "won't work" );
}
try..catch ã¯å®éã«ã¯é¢æ°ãã¹ã±ã¸ã¥ã¼ã«ãã setTimeout å¼ã³åºããã©ããããããã§ããããã颿°èªèº«ã¯å¾ã§å®è¡ããããã®æã¨ã³ã¸ã³ã¯ãã§ã« try..catch æ§é ãæãã¦ãã¾ãã
ã¹ã±ã¸ã¥ã¼ã«ããã颿°ã®å
å´ã®ä¾å¤ããã£ããããããã«ã¯ããã®é¢æ°ã®ä¸ã« try..catch ãå¿
è¦ã§ãã:
setTimeout(function() {
try {
noSuchVariable; // try..catch ãã¨ã©ã¼ããã³ããªã³ã°ãã¾ã!
} catch (e) {
alert( "error is caught here!" );
}
}, 1000);
ã¨ã©ã¼ãªãã¸ã§ã¯ã
ã¨ã©ã¼ãçºçããã¨ããJavaScript ã¯ãã®è©³ç´°ãå«ãããªãã¸ã§ã¯ããçæãã¾ãããã㦠catch ã®å¼æ°ã¨ãã¦æ¸¡ããã¾ãã:
try {
// ...
} catch(err) { // <-- "ã¨ã©ã¼ãªãã¸ã§ã¯ã", err ã®ä»£ããã«å¥ã®ååã使ããã¨ãã§ãã¾ã
// ...
}
ãã¹ã¦ã®çµã¿è¾¼ã¿ã®ã¨ã©ã¼ã«å¯¾ãã¦ãcatch ãããã¯å
ã®ã¨ã©ã¼ãªãã¸ã§ã¯ãã¯2ã¤ã®ä¸»ãªããããã£ãæã£ã¦ãã¾ãã:
name- ã¨ã©ã¼åã§ããæªå®ç¾©å¤æ°ã®å ´åãããã¯
"ReferenceError"ã§ãã message- ã¨ã©ã¼è©³ç´°ã«é¢ããããã¹ãã¡ãã»ã¼ã¸ã§ãã
ã»ã¨ãã©ã®ç°å¢ã§ã¯ããã®ä»éæ¨æºã®ããããã£ãå©ç¨å¯è½ã§ããæãåºã使ããããµãã¼ãããã¦ããã®ã¯ä»¥ä¸ã§ã:
stack- ç¾å¨ã®ã³ã¼ã«ã¹ã¿ãã¯ã§ã: ã¨ã©ã¼ã«ç¹ãã£ããã¹ãå¼ã³åºãã®ã·ã¼ã±ã³ã¹ã«é¢ããæ å ±ãæã¤æååã§ãããããã°ç®çã§ä½¿ããã¾ãã
ä¾:
try {
lalala; // ã¨ã©ã¼, 夿°ã宣è¨ããã¦ãã¾ãã!
} catch(err) {
alert(err.name); // ReferenceError
alert(err.message); // lalala is not defined
alert(err.stack); // ReferenceError: lalala is not defined at (...ã¹ã¿ãã¯å¼ã³åºã)
// å
¨ä½ã¨ãã¦ã¨ã©ã¼ã表示ããäºãã§ãã¾ã
// ã¨ã©ã¼ã¯ "name: message" ã¨ãã¦æååã«å¤æããã¾ã
alert(err); // ReferenceError: lalala is not defined
}
ä»»æã® âcatchâ ãã¤ã³ãã£ã³ã°
ã¨ã©ã¼ã®è©³ç´°ãå¿
è¦ãªãå ´åãcatch ã¯ãããçç¥ã§ãã¾ã:
try {
// ...
} catch { // <-- (err) ãªã
// ...
}
âtryâ¦catchâ ã®å©ç¨
try..catch ã®å®éã®ã¦ã¼ã¹ã±ã¼ã¹ã«ã¤ãã¦æ¢ç´¢ãã¦ã¿ã¾ãããã
æ¢ã«ãåç¥ã®éããJavaScript㯠JSONã¨ã³ã³ã¼ããããå¤ãèªãããã®ã¡ã½ãã JSON.parse(str) ããµãã¼ãããã¦ãã¾ãã
é常ãããã¯ãããã¯ã¼ã¯çµç±ã§ãµã¼ãã¾ãã¯å¥ã®ã½ã¼ã¹ããåä¿¡ãããã¼ã¿ããã³ã¼ãããããã«ä½¿ããã¾ãã
ä»ã次ã®ããã«ãã¼ã¿ãåä¿¡ããJSON.parse ãå¼ã³åºãã¾ãã:
let json = '{"name":"John", "age": 30}'; // ãµã¼ãããã®ãã¼ã¿
let user = JSON.parse(json); // ããã¹ã表ç¾ãJSãªãã¸ã§ã¯ãã«å¤æ
// ä»ã user æååããããããã£ãæã¤ãªãã¸ã§ã¯ãã§ã
alert( user.name ); // John
alert( user.age ); // 30
JSON ã«é¢ããè©³ç´°ãªæ å ±ã¯ããã£ãã¿ã¼ JSON ã¡ã½ãã, toJSON ãåç §ãã¦ãã ããã
json ã䏿£ãªå½¢å¼ã®å ´åãJSON.parse ã¯ã¨ã©ã¼ã«ãªãã®ã§ã¹ã¯ãªããã¯ âæ»ã«ã¾ãâã
ããã§æºè¶³ãã¾ããï¼ãã¡ããæºè¶³ãã¾ãã!
ãã®æ¹æ³ã ã¨ããããã¼ã¿ãä½ãééã£ã¦ããå ´åã訪åè ã¯ãããç¥ããã¨ãã§ãã¾ãã(éçºè ã³ã³ã½ã¼ã«ãéããªãéã)ãã¾ãã人ã ã¯ãã¨ã©ã¼ã¡ãã»ã¼ã¸ãªãã§ä½ãã âåã«æ»ãã§ããâ ãã¨ãæ¬å½ã«æ¬å½ã«å«ãã¾ãã
ã¨ã©ã¼ãæ±ãããã« try..catch ã使ãã¾ãããã:
let json = "{ bad json }";
try {
let user = JSON.parse(json); // <-- ã¨ã©ã¼ãèµ·ããã¨ã...
alert( user.name ); // åä½ãã¾ãã
} catch (e) {
// ...å®è¡ã¯ããã«é£ã³ã¾ã
alert( "Our apologies, the data has errors, we'll try to request it one more time." );
alert( e.name );
alert( e.message );
}
ããã§ã¯ãã¡ãã»ã¼ã¸ã表示ããããã®ã ãã« catch ãããã¯ã使ã£ã¦ãã¾ãããããå¤ãã®ãã¨ããããã¨ãã§ãã¾ãã: æ°ããªãããã¯ã¼ã¯è¦æ±ã訪åè
ã¸ã®ä»£æ¿ææ®µã®ææ¡ããã®ã³ã°æ©æ§ã¸ã¨ã©ã¼ã«é¢ããæ
å ±ã®é信⦠ãã¹ã¦ãåã«æ»ã¬ããã¯ã¯ããã«è¯ãã§ãã
ç¬èªã®ã¨ã©ã¼ãã¹ãã¼ãã
仮㫠json ãæ§æçã«æ£ããããå¿
é ã® "name" ããããã£ãæã£ã¦ããªãå ´åã©ããªãã§ãããï¼
ãã®ããã«:
let json = '{ "age": 30 }'; // ä¸å®å
¨ãªãã¼ã¿
try {
let user = JSON.parse(json); // <-- ã¨ã©ã¼ãªã
alert( user.name ); // name ã¯ããã¾ãã!
} catch (e) {
alert( "doesn't execute" );
}
ããã§ãJSON.parse ã¯é常ã©ããå®è¡ãã¾ããã"name" ã®æ¬ è½ã¯å®éã«ã¯æã
ã«ã¨ã£ã¦ã¯ã¨ã©ã¼ã§ãã
ã¨ã©ã¼å¦çãçµ±ä¸ããããã«ãthrow æ¼ç®åã使ãã¾ãã
âThrowâ æ¼ç®å
throw æ¼ç®åã¯ã¨ã©ã¼ãçæãã¾ãã
æ§æã¯æ¬¡ã®éãã§ã:
throw <error object>
æè¡çã«ã¯ãã¨ã©ã¼ãªãã¸ã§ã¯ãã¨ãã¦ãªãã§ã使ããã¨ãã§ãã¾ãããã¨ããæ°å¤ãæååã®ãããªããªããã£ãã§ãOKã§ããããããname 㨠message ããããã£ãæã¤ãªãã¸ã§ã¯ãã使ãã®ããã¿ã¼ã§ã(çµã¿è¾¼ã¿ã®ã¨ã©ã¼ã¨äºææ§ãããããä¿ã¤ããã«)ã
JavaScriptã¯æ¨æºã¨ã©ã¼ã®ããã®å¤ãã®çµã¿è¾¼ã¿ã®ã³ã³ã¹ãã©ã¯ã¿ãæã£ã¦ãã¾ã: Error, SyntaxError, ReferenceError, TypeError ãªã©ã§ããæã
ãã¨ã©ã¼ãªãã¸ã§ã¯ããä½ãã®ã«ãããã使ãã¾ãã
æ§æã¯æ¬¡ã®éãã§ã:
let error = new Error(message);
// or
let error = new SyntaxError(message);
let error = new ReferenceError(message);
// ...
çµã¿è¾¼ã¿ã®ã¨ã©ã¼(ä»»æã®ãªãã¸ã§ã¯ãã§ã¯ãªããã¨ã©ã¼ã®ã¿)ã§ã¯ãname ããããã£ã¯ã³ã³ã¹ãã©ã¯ã¿ã®ååã¨å
¨ãåãã«ãªãã¾ãããã㦠message ã¯å¼æ°ããåããã¾ãã
ä¾:
let error = new Error("Things happen o_O");
alert(error.name); // Error
alert(error.message); // Things happen o_O
JSON.parse ãçæããã¨ã©ã¼ã®ç¨®é¡ãè¦ã¦ã¿ã¾ããã:
try {
JSON.parse("{ bad json o_O }");
} catch(e) {
alert(e.name); // SyntaxError
alert(e.message); // Unexpected token o in JSON at position 0
}
ã覧ã®éãããã㯠SyntaxError ã§ãã
â¦ããã¦ãæã
ã®ã±ã¼ã¹ã§ã¯ãã¦ã¼ã¶ã¯å¿
ã "name" ãæã£ã¦ããã¨ä»®å®ããã®ã§ãname ã®æ¬ è½ãã¾ãæ§æã¨ã©ã¼ã¨ãã¦æ±ãã¾ãã
ãªã®ã§ããããã¹ãã¼ããããã«ãã¾ããã:
let json = '{ "age": 30 }'; // ä¸å®å
¨ãªãã¼ã¿
try {
let user = JSON.parse(json); // <-- ã¨ã©ã¼ãªã
if (!user.name) {
throw new SyntaxError("Incomplete data: no name"); // (*)
}
alert( user.name );
} catch(e) {
alert( "JSON Error: " + e.message ); // JSON Error: Incomplete data: no name
}
è¡ (*) ã§ãthrow æ¼ç®åãä¸ãããã message ã§ SyntaxError ãçæãã¾ãããã㯠JavaScript ãçæããã®ã¨åãæ¹æ³ã§ããtry ã®å®è¡ã¯ããã«åæ¢ããå¶å¾¡ããã¼ã¯ catch ã«ç§»ãã¾ãã
ä»ããcatch ã¯JSON.parse ã¨ä»ã®ã±ã¼ã¹ãã¹ã¦ã®ã¨ã©ã¼ãã³ããªã³ã°ã®ããã®1ã¤ã®å ´æã«ãªãã¾ããã
åã¹ãã¼
ä¸ã®ä¾ã§ãç§ãã¡ã¯ä¸æ£ãªãã¼ã¿ãå¦çããããã« try..catch ã使ã£ã¦ãã¾ããããããtry {...} ãããã¯ã®ä¸ã§ å¥ã®äºæããªãã¨ã©ã¼ ãçºçããå¯è½æ§ã¯ããã§ããããï¼ å¤æ°ãæªå®ç¾©ãã¾ãã¯ãã®ä»ãåã« â䏿£ãªãã¼ã¿â ã§ã¯ãªãä½ãã
ä¾:
let json = '{ "age": 30 }'; // ä¸å®å
¨ãªãã¼ã¿
try {
user = JSON.parse(json); // <-- user ã®åã« "let" ãã¤ãå¿ãã
// ...
} catch(err) {
alert("JSON Error: " + err); // JSON Error: ReferenceError: user is not defined
// (å®éã«ã¯JSONã®ã¨ã©ã¼ã§ã¯ããã¾ãã)
}
ãã¡ããããã¹ã¦ã®å¯è½æ§ãããã¾ã! ããã°ã©ãã¯ãã¹ããããã®ã§ããä½åå¹´ãä½ç¾ä¸äººãã®äººã使ã£ã¦ãããªã¼ãã³ã½ã¼ã¹ã®ã¦ã¼ãã£ãªãã£ã§ãã£ã¦ããçªç¶é
·ããã°ãçºè¦ãããã²ã©ããããã³ã°ã«ã¤ãªãããã¨ãããã¾ãï¼ ssh ãã¼ã«ã§èµ·ãã£ããããªãã®ã§ãï¼ã
ç§ãã¡ã®ã±ã¼ã¹ã§ã¯ãtry..catch 㯠â䏿£ãªãã¼ã¿â ã¨ã©ã¼ããã£ãããããã¨ãæå³ãã¦ãã¾ãããããããã®æ§è³ªä¸ãcatch 㯠try ããã® ãã¹ã¦ã® ã¨ã©ã¼ãåå¾ãã¾ããããã§ã¯äºæããªãã¨ã©ã¼ãçºçãã¾ãããåã "JSON Error" ã¡ãã»ã¼ã¸ã表示ããã¾ããããã¯èª¤ãã§ã³ã¼ãã®ãããã°ãããé£ãããã¾ãã
ãã®ãããªåé¡ãé¿ãããããâåã¹ãã¼â ã¨ããææ³ãå©ç¨ã§ãã¾ããã«ã¼ã«ã¯ã·ã³ãã«ã§ã:
ãã£ããã¯ãããç¥ã£ã¦ããã¨ã©ã¼ã ããå¦çãããã¹ã¦ã®ãªãã¸ã§ã¯ãã âåã¹ãã¼â ããã¹ãã§ã
âåã¹ãã¼â ãã¯ããã¯ã®è©³ç´°ã¯æ¬¡ã®ããã«èª¬æã§ãã¾ã:
- ãã¹ã¦ã®ã¨ã©ã¼ããã£ãããã¾ãã
catch(err) {...}ãããã¯ã§ãã¨ã©ã¼ãªãã¸ã§ã¯ãerrãè§£æãã¾ãã- ã©ãå¦çããã°ãããåãããªããã°ã
throw errããã¾ãã
é常ã¯ãinstanceof æ¼ç®åã使ç¨ãã¦ã¨ã©ã¼ã®ç¨®é¡ããã§ãã¯ã§ãã¾ãã:
try {
user = { /*...*/ };
} catch (err) {
if (err instanceof ReferenceError) {
alert('ReferenceError'); // æªå®ç¾©å¤æ°ã¸ã®ã¢ã¯ã»ã¹ã«å¯¾ãã "ReferenceError"
}
}
ã¾ããerro.name ããããã£ãããã¨ã©ã¼ã¯ã©ã¹åãåå¾ãããã¨ãå¯è½ã§ãããã¹ã¦ã®ãã¤ãã£ãã¨ã©ã¼ã¯ã¨ã©ã¼ã¯ã©ã¹åãããã¾ããããï¼ã¤ã®é¸æè¢ã¯ãerr.constructor.name ãåç
§ãããã¨ã§ãã
ä¸ã®ã³ã¼ãã§ã¯ãcatch ã SyntaxError ã ããå¦çããããåã¹ãã¼ã使ã£ã¦ãã¾ãã:
let json = '{ "age": 30 }'; // ä¸å®å
¨ãªãã¼ã¿
try {
let user = JSON.parse(json);
if (!user.name) {
throw new SyntaxError("Incomplete data: no name");
}
blabla(); // äºæããªãã¨ã©ã¼
alert( user.name );
} catch(e) {
if (e.name == "SyntaxError") {
alert( "JSON Error: " + e.message );
} else {
throw e; // åã¹ãã¼ (*)
}
}
è¡ (*) ã§ã®ãcatch ãããã¯å
é¨ããã®ã¨ã©ã¼ã®ã¹ãã¼ã¯ try..catch ã âæãã¦â å¤é¨ã® try..catch æ§é (åå¨ããå ´å)ã§ãã£ããããããã¾ãã¯ã¹ã¯ãªããããã«ãã¾ãã
å¾ã£ã¦ãcatch ãããã¯ã¯å®éã«æ±ãæ¹ãç¥ã£ã¦ããã¨ã©ã¼ã ããå¦çããã®ä»ãã¹ã¦ã âã¹ãããâ ãã¾ãã
ä¸ã®ä¾ã¯ããã®ãããªã¨ã©ã¼ã1ã¤ä¸ã®ã¬ãã«ã® try..catch ã§ææããããã¢ã§ã:
function readData() {
let json = '{ "age": 30 }';
try {
// ...
blabla(); // error!
} catch (e) {
// ...
if (e.name != 'SyntaxError') {
throw e; // åã¹ãã¼ (ä»ã®ã¨ã©ã¼ã®æ±ãæ¹ãç¥ããªã)
}
}
}
try {
readData();
} catch (e) {
alert( "External catch got: " + e ); // caught it!
}
ããã§ã¯ãreadData 㯠SyntaxError ã®å¦çã®ä»æ¹ã ãç¥ã£ã¦ãããå¤é¨ã® try..catch ã¯ãã¹ã¦ã®å¦çã®æ¹æ³ãç¥ã£ã¦ãã¾ãã
tryâ¦catchâ¦finally
å¾ ã£ã¦ãã ãããããã§ãã¹ã¦ã§ã¯ããã¾ããã
try..catch æ§é ã¯ãã1ã¤ã®ã³ã¼ãå¥: finally ãæã¤å ´åãããã¾ãã
ããåå¨ããå ´åãããã¯ãã¹ã¦ã®ã±ã¼ã¹ã§å®è¡ãã¾ãã:
- ã¨ã©ã¼ãç¡ãã£ãå ´åã¯ã
tryã®å¾ã§ã - ã¨ã©ã¼ããã£ãå ´åã«ã¯
catchã®å¾ã§ã
æ¡å¼µãããæ§æã¯ãã®ããã«ãªãã¾ãã:
try {
... ã³ã¼ããå®è¡ãããã¨ãã¾ã ...
} catch(e) {
... ã¨ã©ã¼ãå¦çãã¾ã ...
} finally {
... 常ã«å®è¡ãã¾ã ...
}
ãã®ã³ã¼ããå®è¡ãã¦ã¿ã¾ãããã:
try {
alert( 'try' );
if (confirm('Make an error?')) BAD_CODE();
} catch (e) {
alert( 'catch' );
} finally {
alert( 'finally' );
}
ãã®ã³ã¼ãã¯2ã¤ã®å®è¡æ¹æ³ãããã¾ãã:
- ãã âMake an errorâ ã« âYesâ ã¨çããã¨ã
try -> catch -> finallyã¨ãªãã¾ãã - ãã âNoâ ã¨è¨ãã°ã
try -> finallyã¨ãªãã¾ãã
finally å¥ã¯ try..catch ã®åã«ä½ããéå§ãã¦ãã©ã®ãããªçµæã§ãããã¡ã¤ãã©ã¤ãºããããã¨ãã«é »ç¹ã«ä½¿ããã¾ãã
ä¾ãã°ããã£ããããæ°é¢æ° fib(n) ã«ãããæéãè¨æ¸¬ãããã¨ãã¾ããå½ç¶ãªããããããå®è¡ããåã«è¨æ¸¬ãéå§ãã¦ãå®è¡å¾ã«çµäºããããã¨ãã§ãã¾ããããããä»®ã«é¢æ°å¼ã³åºãã®éã§ã¨ã©ã¼ãèµ·ãããã©ããªãã§ãããï¼ç¹ã«ä¸ã®ã³ã¼ãã® fib(n) ã®å®è£
ã§ã¯ãè² ã®å¤ã¾ãã¯éæ´æ°å¤ã ã¨ã¨ã©ã¼ãè¿ãã¾ãã
finally å¥ã¯ä½ããã£ã¦ãè¨æ¸¬ãå®äºãããã®ã«è¯ãå ´æã§ãã
ããã§ãfinally ã¯ä¸¡æ¹ã®ã·ãã¥ã¨ã¼ã·ã§ã³ â fib ã®å®è¡ãæåããã±ã¼ã¹ã¨å¤±æããã±ã¼ã¹ â ã§æéãæ£ããè¨æ¸¬ããããã¨ãä¿è¨¼ãã¾ãã:
let num = +prompt("Enter a positive integer number?", 35)
let diff, result;
function fib(n) {
if (n < 0 || Math.trunc(n) != n) {
throw new Error("Must not be negative, and also an integer.");
}
return n <= 1 ? n : fib(n - 1) + fib(n - 2);
}
let start = Date.now();
try {
result = fib(num);
} catch (e) {
result = 0;
} finally {
diff = Date.now() - start;
}
alert(result || "error occured");
alert( `execution took ${diff}ms` );
ã³ã¼ããå®è¡ã㦠prompt ã« 35 ãå
¥åãããã¨ã§ç¢ºèªã§ãã¾ã â é常 try ã®å¾ã« finally ãå®è¡ãã¾ãããã㦠-1 ãå
¥ãã㨠â ããã«ã¨ã©ã¼ã«ãªãããã®å®è¡ã¯ 0ms ã¨ãªãã¾ãã両æ¹ã®è¨æ¸¬ã¯æ£ããè¡ããã¦ãã¾ãã
ã¤ã¾ãã颿°ãçµäºããã«ã¯æ¹æ³ã2ã¤ããã¾ã: return ã¾ã㯠throw ã§ãã finally å¥ã¯ããã両æ¹ã¨ãå¦çãã¾ãã
try..catch..finally ã®å
é¨ã§ãã¼ã«ã«ã§ãä¸ã®ã³ã¼ãã§ result 㨠diff 夿°ã¯ try..catch ã® å ã§å®£è¨ããã¦ãããã¨ã«æ³¨æãã¦ãã ããã
ããã§ãªããlet ã {...} ãããã¯ã®ä¸ã§ä½ããã¦ããå ´åããã®ä¸ã§ããè¦ãã¾ããã
finally 㨠returnFinally å¥ã¯ãtry..catch ããã® ä»»æã® çµäºã«å¯¾ãã¦æ©è½ãã¾ããããã¯æç½ãª return ãå«ã¿ã¾ãã
ä¸ã®ä¾ã§ã¯ãtry ã®ä¸ã§ return ãããã¾ãããã®å ´åãfinally ã¯å¶å¾¡ãå¤é¨ã³ã¼ãã«æ»ãåã«å®è¡ããã¾ãã
function func() {
try {
return 1;
} catch (e) {
/* ... */
} finally {
alert( 'finally' );
}
}
alert( func() ); // æåã« finally ã® alert ãåä½ããæ¬¡ã«ãããåä½ãã¾ã
try..finallycatch å¥ããªã try..catch æ§é ãå½¹ç«ã¡ã¾ããç§ãã¡ã¯ããã§ã¨ã©ã¼ãæ£ããå¦çããããªãããéå§ããå¦çãå®äºãããã¨ã確èªãããã¨ãã«ä½¿ãã¾ãã
function func() {
// (è¨æ¸¬ãªã©)å®äºãããå¿
è¦ã®ãããªã«ããéå§ãã
try {
// ...
} finally {
// ãã¹ã¦ãæ»ãã§ãã¦ãå®äºããã
}
}
ä¸ã®ã³ã¼ãã§ã¯ãtry ã®å
å´ã®ã¨ã©ã¼ã¯å¸¸ã«æãã¾ãããªããªã catch ããªãããã§ããããã finally ã¯å®è¡ããã¼ãå¤é¨ã«ç§»ãåã«æ©è½ãã¾ãã
ã°ãã¼ãã«ãª catch
ãã®ã»ã¯ã·ã§ã³ã®æ å ±ã¯ã³ã¢ãªJavaScriptã®ä¸é¨ã§ã¯ããã¾ããã
try..catch ã®å¤å´ã§è´å½çãªã¨ã©ã¼ãèµ·ãã¦ã¹ã¯ãªãããæ»ãã ãã¨ãã¤ã¡ã¼ã¸ãã¦ãã ãããããã°ã©ãã³ã°ã¨ã©ã¼ããã®ä»ä½ãé
·ããã®ã«ãã£ã¦ã
ãã®ãããªåºæ¥äºã«åå¿ããæ¹æ³ã¯ããã¾ããï¼ ã¨ã©ã¼ããã°ã«è¨é²ããããã¦ã¼ã¶ã¼ã«ä½ããè¦ãããï¼é常ã¯ã¨ã©ã¼ã¡ãã»ã¼ã¸ã表示ããã¾ããï¼ã
仿§ã§ã¯ãã®ãããªãã®ã¯ããã¾ããããé常ãç°å¢ããããæä¾ãã¦ãã¾ãããªããªãæ¬å½ã«æç¨ã ããã§ããä¾ãã°ãNode.js ã¯ãã®ããã« process.on(âuncaughtExceptionâ)ãæã£ã¦ãã¾ããã¾ãããã©ã¦ã¶ã§ã¯é¢æ°ãç¹å¥ãª window.onerror ããããã£ã«ä»£å ¥ãããã¨ãã§ãã¾ããããã¯ãã£ãããã¦ããªãã¨ã©ã¼ã®å ´åã«å®è¡ããã¾ãã
æ§æ:
window.onerror = function(message, url, line, col, error) {
// ...
};
message- ã¨ã©ã¼ã¡ãã»ã¼ã¸
url- ã¨ã©ã¼ãèµ·ããã¹ã¯ãªããã®URL
line,col- ã¨ã©ã¼ãèµ·ããè¡ã¨åçªå·
error- ã¨ã©ã¼ãªãã¸ã§ã¯ã
ä¾:
<script>
window.onerror = function(message, url, line, col, error) {
alert(`${message}\n At ${line}:${col} of ${url}`);
};
function readData() {
badFunc(); // ãã£ã¨ãä½ããããããã§ã!
}
readData();
</script>
ã°ãã¼ãã«ãã³ãã©ã¼ window.onerror ã®å½¹å²ã¯ãé常ã¹ã¯ãªããã®å®è¡ã®å復ã§ã¯ããã¾ãã â ããã°ã©ãã³ã°ã¨ã©ã¼ã®å ´åãæããããã¯ä¸å¯è½ãªã®ã§éçºè
ã«ã¨ã©ã¼ã¡ãã»ã¼ã¸ãéãã¾ãã
ãã®ãããªã±ã¼ã¹ã§ã¨ã©ã¼ãã°ãæä¾ãã web ãµã¼ãã¹ãããã¾ããhttps://errorception.com> ã http://www.muscula.comã
ãããã¯æ¬¡ã®ããã«åãã¾ã:
- ç§ãã¡ã¯ãµã¼ãã¹ã«ç»é²ãããã¼ã¸ã«æ¿å ¥ããããã®JSã®ãã¼ã¹(ã¾ãã¯ã¹ã¯ãªããã®URL)ããããããå¾ã¾ãã
- ãã®JSã¹ã¯ãªããã¯ã«ã¹ã¿ã ã®
window.onerror颿°ãæã£ã¦ãã¾ãã - ã¨ã©ã¼ãèµ·ããæããã®ãµã¼ãã¹ã¸ãããã¯ã¼ã¯ãªã¯ã¨ã¹ããéãã¾ãã
- ç§ãã¡ã¯ãµã¼ãã¹ã®Webã¤ã³ã¿ãã§ã¼ã¹ã«ãã°ã¤ã³ãã¦ã¨ã©ã¼ãè¦ããã¨ãã§ãã¾ãã
ãµããª
try..catch æ§é ã¯ã©ã³ã¿ã¤ã ã¨ã©ã¼ãå¦çãããã¨ãã§ãã¾ããæåéãã³ã¼ããå®è¡ãããã¨è©¦ã¿ã¦ããã®ä¸ã§èµ·ããã¨ã©ã¼ããã£ãããã¾ãã
æ§æã¯æ¬¡ã®éãã§ã:
try {
// ã³ã¼ããå®è¡
} catch(err) {
// ã¨ã©ã¼ãèµ·ããå ´åãããã«ã¸ã£ã³ã
// err ã¯ã¨ã©ã¼ãªãã¸ã§ã¯ã
} finally {
// ãã¹ã¦ã®ã±ã¼ã¹ã§ try/catch å¾ã«å®è¡ãã
}
catch ã»ã¯ã·ã§ã³ããªããã¾ã㯠finally ããªãå ´åãããã¾ãããªã®ã§ try..catch 㨠try..finally ãã¾ãæå¹ã§ãã
ã¨ã©ã¼ãªãã¸ã§ã¯ãã¯æ¬¡ã®ããããã£ãæã£ã¦ãã¾ãã:
messageâ 人ãèªããã¨ã©ã¼ã¡ãã»ã¼ã¸ã§ããnameâ ã¨ã©ã¼åãæãæååã§ã(ã¨ã©ã¼ã³ã³ã¹ãã©ã¯ã¿å)stack(鿍æº) â ã¨ã©ã¼çææã®ã¹ã¿ãã¯ã§ãã
ã¨ã©ã¼ãªãã¸ã§ã¯ããä¸è¦ã§ããã°ãcatch (err) { ã®ä»£ããã« catch { ã¨ãããã¨ã§çç¥ã§ãã¾ãã
ã¾ããthrow æ¼ç®åã使ã£ã¦ç¬èªã®ã¨ã©ã¼ãçæãããã¨ãã§ãã¾ããæè¡çã«ã¯ãthrow ã®å¼æ°ã¯ä½ã§ãããã§ãããé常ã¯çµã¿è¾¼ã¿ã® Error ã¯ã©ã¹ãç¶æ¿ãã¦ããã¨ã©ã¼ãªãã¸ã§ã¯ãã§ããæ¬¡ã®ãã£ãã¿ã¼ã§ã¨ã©ã¼ãæ¡å¼µããæ¹æ³ã«ã¤ãã¦è©³ãã説æãã¾ãã
åã¹ãã¼ ã¯ã¨ã©ã¼ãã³ããªã³ã°ã®é常ã«éè¦ãªãã¿ã¼ã³ã§ãã: catch ãããã¯ã¯é常ãç¹å®ã®ã¨ã©ã¼ã¿ã¤ããå¦çããæ¹æ³ãäºæããç¥ã£ã¦ãã¾ãããããã£ã¦ãç¥ããªãã¨ã©ã¼ã¯åã¹ãã¼ãã¹ãã§ãã
ãã¨ã try..catch ãæã£ã¦ããªãå ´åã§ããã»ã¨ãã©ã®ç°å¢ã§ã¯ âæãåºãâ ã¨ã©ã¼ããã£ããããããã« âã°ãã¼ãã«â ãªã¨ã©ã¼ãã³ãã©ãè¨å®ãããã¨ãã§ãã¾ãããã©ã¦ã¶ã§ã¯ããã㯠window.onerror ã§ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã