ä¸ç®¡ä½ å¤ä¹ç²¾éç¼ç¨ï¼ææ¶æä»¬çèæ¬æ»è¿æ¯ä¼åºç°é误ãå¯è½æ¯å 为æä»¬çç¼ååºéï¼ææ¯ä¸é¢æä¸åçç¨æ·è¾å ¥ï¼ææ¯é误çæå¡ç«¯ååºä»¥åå ¶ä»æ°åç§åå ã
é常ï¼å¦æåçé误ï¼èæ¬å°±ä¼âæ»äº¡âï¼ç«å³åæ¢ï¼ï¼å¹¶å¨æ§å¶å°å°é误æå°åºæ¥ã
使¯æä¸ç§è¯æ³ç»æ try...catchï¼å®ä½¿æä»¬å¯ä»¥âæè·ï¼catchï¼âé误ï¼å æ¤èæ¬å¯ä»¥æ§è¡æ´åççæä½ï¼è䏿¯æ»æã
âtryâ¦catchâ è¯æ³
try...catch ç»æç±ä¸¤é¨åç»æï¼try å catchï¼
try {
// 代ç ...
} catch (err) {
// é误æè·
}
å®æç §ä»¥ä¸æ¥éª¤æ§è¡ï¼
- é¦å
ï¼æ§è¡
try {...}ä¸ç代ç ã - 妿è¿é没æé误ï¼å忽ç¥
catch (err)ï¼æ§è¡å°tryçæ«å°¾å¹¶è·³è¿catchç»§ç»æ§è¡ã - 妿è¿éåºç°é误ï¼å
tryæ§è¡åæ¢ï¼æ§å¶æµè½¬åcatch (err)çå¼å¤´ãåéerrï¼æä»¬å¯ä»¥ä½¿ç¨ä»»ä½åç§°ï¼å°å å«ä¸ä¸ª error 对象ï¼è¯¥å¯¹è±¡å å«äºæåçäºä»¶ç详ç»ä¿¡æ¯ã
æä»¥ï¼try {...} åå
ç error ä¸ä¼ææ»èæ¬ ââ æä»¬ææºä¼å¨ catch ä¸å¤çå®ã
让æä»¬æ¥çä¸äºä¾åã
-
没æ error çä¾åï¼æ¾ç¤º
alert(1)å(2)ï¼try { alert('å¼å§æ§è¡ try ä¸çå 容'); // (1) <-- // ...è¿é没æ error alert('try ä¸çå 容æ§è¡å®æ¯'); // (2) <-- } catch (err) { alert('catch 被忽ç¥ï¼å 为没æ error'); // (3) } -
å å« error çä¾åï¼æ¾ç¤º
(1)å(3)è¡çalertä¸çå 容ï¼try { alert('å¼å§æ§è¡ try ä¸çå 容'); // (1) <-- lalala; // errorï¼åéæªå®ä¹ï¼ alert('try çæ«å°¾ï¼æªæ§è¡å°æ¤å¤ï¼'); // (2) } catch (err) { alert(`åºç°äº errorï¼`); // (3) <-- }
try...catch ä»
对è¿è¡æ¶ç error ææè¦ä½¿å¾ try...catch è½å·¥ä½ï¼ä»£ç å¿
é¡»æ¯å¯æ§è¡çãæ¢å¥è¯è¯´ï¼å®å¿
é¡»æ¯ææç JavaScript 代ç ã
妿代ç å
å«è¯æ³é误ï¼é£ä¹ try..catch å°æ æ³æ£å¸¸å·¥ä½ï¼ä¾å¦å«æä¸å¹é
çè±æ¬å·ï¼
try {
{{{{{{{{{{{{
} catch (err) {
alert("å¼ææ æ³çè§£è¿æ®µä»£ç ï¼å®æ¯æ æç");
}
JavaScript 弿é¦å ä¼è¯»å代ç ï¼ç¶åè¿è¡å®ãå¨è¯»åé¶æ®µåççé误被称为âè§£ææ¶é´ï¼parse-timeï¼âé误ï¼å¹¶ä¸æ æ³æ¢å¤ï¼ä»è¯¥ä»£ç å é¨ï¼ãè¿æ¯å ä¸ºå¼ææ æ³ç解该代ç ã
æä»¥ï¼try...catch åªè½å¤çææä»£ç ä¸åºç°çé误ãè¿ç±»é误被称为âè¿è¡æ¶çé误ï¼runtime errorsï¼âï¼ææ¶è¢«ç§°ä¸ºâå¼å¸¸ï¼exceptionsï¼âã
try...catch 忥æ§è¡å¦æå¨â计åçï¼scheduledï¼â代ç ä¸åçå¼å¸¸ï¼ä¾å¦å¨ setTimeout ä¸ï¼å try...catch ä¸ä¼æè·å°å¼å¸¸ï¼
try {
setTimeout(function() {
noSuchVariable; // èæ¬å°å¨è¿é忢è¿è¡
}, 1000);
} catch (err) {
alert( "ä¸å·¥ä½" );
}
å 为 try...catch å
裹äºè®¡åè¦æ§è¡ç彿°ï¼è¯¥å½æ°æ¬èº«è¦ç¨åææ§è¡ï¼è¿æ¶å¼æå·²ç»ç¦»å¼äº try...catch ç»æã
ä¸ºäºæè·å°è®¡åçï¼scheduledï¼å½æ°ä¸çå¼å¸¸ï¼é£ä¹ try...catch å¿
é¡»å¨è¿ä¸ªå½æ°å
ï¼
setTimeout(function() {
try {
noSuchVariable; // try...catch å¤ç error äºï¼
} catch {
alert( "error 被å¨è¿éæè·äºï¼" );
}
}, 1000);
Error 对象
åçé误æ¶ï¼JavaScript ä¼çæä¸ä¸ªå
嫿å
³æ¤ error 详ç»ä¿¡æ¯ç对象ãç¶åå°è¯¥å¯¹è±¡ä½ä¸ºåæ°ä¼ éç» catchï¼
try {
// ...
} catch (err) { // <-- âerror 对象âï¼ä¹å¯ä»¥ç¨å
¶ä»åæ°åä»£æ¿ err
// ...
}
å¯¹äºææå 建ç errorï¼error å¯¹è±¡å ·æä¸¤ä¸ªä¸»è¦å±æ§ï¼
name- Error åç§°ãä¾å¦ï¼å¯¹äºä¸ä¸ªæªå®ä¹çåéï¼åç§°æ¯
"ReferenceError"ã message- å ³äº error çè¯¦ç»æåæè¿°ã
è¿æå ¶ä»éæ åç屿§å¨å¤§å¤æ°ç¯å¢ä¸å¯ç¨ãå ¶ä¸è¢«æå¹¿æ³ä½¿ç¨åæ¯æçæ¯ï¼
stack- å½åçè°ç¨æ ï¼ç¨äºè°è¯ç®ççä¸ä¸ªå符串ï¼å ¶ä¸å å«æå ³å¯¼è´ error çåµå¥è°ç¨åºåçä¿¡æ¯ã
ä¾å¦ï¼
try {
lalala; // error, variable is not defined!
} catch (err) {
alert(err.name); // ReferenceError
alert(err.message); // lalala is not defined
alert(err.stack); // ReferenceError: lalala is not defined at (...call stack)
// ä¹å¯ä»¥å°ä¸ä¸ª error ä½ä¸ºæ´ä½æ¾ç¤ºåºæ¥
// error ä¿¡æ¯è¢«è½¬æ¢ä¸ºå "name: message" è¿æ ·çå符串
alert(err); // ReferenceError: lalala is not defined
}
å¯éç âcatchâ ç»å®
妿æä»¬ä¸éè¦ error ç详ç»ä¿¡æ¯ï¼catch ä¹å¯ä»¥å¿½ç¥å®ï¼
try {
// ...
} catch { // <-- 没æ (err)
// ...
}
ä½¿ç¨ âtryâ¦catchâ
让æä»¬ä¸èµ·æ¢ç©¶ä¸ä¸çå®åºæ¯ä¸ try...catch çç¨ä¾ã
æ£å¦æä»¬æç¥éçï¼JavaScript æ¯æ JSON.parse(str) æ¹æ³æ¥è§£æ JSON ç¼ç çå¼ã
é常ï¼å®è¢«ç¨æ¥è§£æä»ç½ç»ãæå¡å¨ææ¯å ¶ä»æ¥æºæ¥æ¶å°çæ°æ®ã
æä»¬æ¶å°æ°æ®åï¼ç¶ååä¸é¢è¿æ ·è°ç¨ JSON.parseï¼
let json = '{"name":"John", "age": 30}'; // æ¥èªæå¡å¨çæ°æ®
let user = JSON.parse(json); // å°ææ¬è¡¨ç¤ºè½¬æ¢æ JavaScript 对象
// ç°å¨ user æ¯ä¸ä¸ªè§£æèª json å符串çæèªå·±å±æ§ç对象
alert( user.name ); // John
alert( user.age ); // 30
ä½ å¯ä»¥å¨ JSON æ¹æ³ï¼toJSON ä¸ç« 䏿¾å°æ´å¤å ³äº JSON ç详ç»å 容ã
妿 json æ ¼å¼é误ï¼JSON.parse å°±ä¼çæä¸ä¸ª errorï¼å æ¤èæ¬å°±ä¼âæ»äº¡âã
æä»¬å¯¹æ¤æ»¡æåï¼å½ç¶ä¸ï¼
å¦æè¿æ ·åï¼å½æ¿å°çæ°æ®åºäºé®é¢ï¼é£ä¹è®¿é®è æ°¸è¿é½ä¸ä¼ç¥éåå ï¼é¤éä»ä»¬æå¼å¼åè æ§å¶å°ï¼ãä»£ç æ§è¡å¤±è´¥å´æ²¡ææç¤ºä¿¡æ¯ï¼è¿ççæ¯å¾ç³ç³çç¨æ·ä½éªã
让æä»¬ç¨ try...catch æ¥å¤çè¿ä¸ª errorï¼
let json = "{ bad json }";
try {
let user = JSON.parse(json); // <-- å½åºç° error æ¶...
alert( user.name ); // ä¸å·¥ä½
} catch (err) {
// ...æ§è¡ä¼è·³è½¬å°è¿éå¹¶ç»§ç»æ§è¡
alert( "徿±æï¼æ°æ®æéè¯¯ï¼æä»¬ä¼å°è¯å请æ±ä¸æ¬¡ã" );
alert( err.name );
alert( err.message );
}
å¨è¿å¿ï¼æä»¬å° catch åä»
ä»
ç¨äºæ¾ç¤ºä¿¡æ¯ï¼ä½æä»¬å¯ä»¥åæ´å¤çäºï¼åéä¸ä¸ªæ°çç½ç»è¯·æ±ï¼å访é®è
建议ä¸ä¸ªæ¿ä»£æ¹æ¡ï¼å°æå
³é误çä¿¡æ¯åéç»è®°å½æ¥å¿ç设å¤ï¼â¦â¦ãææè¿äºé½æ¯ä»£ç âæ»æâ好å¾å¤ã
æåºæä»¬èªå®ä¹ç error
妿è¿ä¸ª json å¨è¯æ³ä¸æ¯æ£ç¡®çï¼ä½æ¯æ²¡ææå¿
é¡»ç name 屿§è¯¥æä¹åï¼
åè¿æ ·ï¼
let json = '{ "age": 30 }'; // ä¸å®æ´çæ°æ®
try {
let user = JSON.parse(json); // <-- 没æ error
alert( user.name ); // 没æ nameï¼
} catch (err) {
alert( "doesn't execute" );
}
è¿é JSON.parse æ£å¸¸æ§è¡ï¼ä½ç¼ºå° name 屿§å¯¹æä»¬æ¥è¯´ç¡®å®æ¯ä¸ª errorã
为äºç»ä¸è¿è¡ error å¤çï¼æä»¬å°ä½¿ç¨ throw æä½ç¬¦ã
âthrowâ æä½ç¬¦
throw æä½ç¬¦ä¼çæä¸ä¸ª error 对象ã
è¯æ³å¦ä¸ï¼
throw <error object>
ææ¯ä¸è®²ï¼æä»¬å¯ä»¥å°ä»»ä½ä¸è¥¿ç¨ä½ error 对象ãçè³å¯ä»¥æ¯ä¸ä¸ªåå§ç±»åæ°æ®ï¼ä¾å¦æ°åæå符串ï¼ä½æå¥½ä½¿ç¨å¯¹è±¡ï¼æå¥½ä½¿ç¨å
·æ name å message 屿§çå¯¹è±¡ï¼æç§ç¨åº¦ä¸ä¿æä¸å
建 error çå
¼å®¹æ§ï¼ã
JavaScript 䏿å¾å¤å
å»ºçæ å error çæé å¨ï¼Errorï¼SyntaxErrorï¼ReferenceErrorï¼TypeError çãæä»¬ä¹å¯ä»¥ä½¿ç¨å®ä»¬æ¥å建 error 对象ã
å®ä»¬çè¯æ³æ¯ï¼
let error = new Error(message);
// æ
let error = new SyntaxError(message);
let error = new ReferenceError(message);
// ...
对äºå
建ç errorï¼ä¸æ¯å¯¹äºå
¶ä»ä»»ä½å¯¹è±¡ï¼ä»
ä»
æ¯å¯¹äº errorï¼ï¼name 屿§åå¥½å°±æ¯æé å¨çååãmessage 忥èªäºåæ°ï¼argumentï¼ã
ä¾å¦ï¼
let error = new Error("Things happen o_O");
alert(error.name); // Error
alert(error.message); // Things happen o_O
让æä»¬æ¥çç JSON.parse ä¼çæä»ä¹æ ·ç errorï¼
try {
JSON.parse("{ bad json o_O }");
} catch(err) {
alert(err.name); // SyntaxError
alert(err.message); // Unexpected token b in JSON at position 2
}
æ£å¦æä»¬æçå°çï¼ é£æ¯ä¸ä¸ª SyntaxErrorã
卿们ç示ä¾ä¸ï¼ç¼ºå° name 屿§å°±æ¯ä¸ä¸ª errorï¼å ä¸ºç¨æ·å¿
é¡»æä¸ä¸ª nameã
æä»¥ï¼è®©æä»¬æåºè¿ä¸ª errorã
let json = '{ "age": 30 }'; // ä¸å®æ´çæ°æ®
try {
let user = JSON.parse(json); // <-- 没æ error
if (!user.name) {
throw new SyntaxError("æ°æ®ä¸å
¨ï¼æ²¡æ name"); // (*)
}
alert( user.name );
} catch(err) {
alert( "JSON Error: " + err.message ); // JSON Error: æ°æ®ä¸å
¨ï¼æ²¡æ name
}
å¨ (*) æ è®°çè¿ä¸è¡ï¼throw æä½ç¬¦çæäºå
å«çæä»¬æç»å®ç message ç SyntaxErrorï¼ä¸ JavaScript èªå·±çæçæ¹å¼ç¸åãtry çæ§è¡ç«å³åæ¢ï¼æ§å¶æµè½¬å catch åã
ç°å¨ï¼catch æä¸ºäºææ error å¤ççå¯ä¸åºæï¼å¯¹äº JSON.parse åå
¶ä»æ
åµé½éç¨ã
忬¡æåºï¼Rethrowingï¼
å¨ä¸é¢çä¾åä¸ï¼æä»¬ä½¿ç¨ try...catch æ¥å¤ç䏿£ç¡®çæ°æ®ã使¯å¨ try {...} å䏿¯å¦å¯è½åç å¦ä¸ä¸ªé¢æä¹å¤ç errorï¼ä¾å¦ç¼ç¨éè¯¯ï¼æªå®ä¹åéï¼æå
¶ä»é误ï¼èä¸ä»
ä»
æ¯è¿ç§â䏿£ç¡®çæ°æ®âã
ä¾å¦ï¼
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 Error)
}
å½ç¶ï¼ä¸åçæå¯è½ï¼ç¨åºåä¹ä¼ç¯éãå³ä½¿æ¯è¢«æ°ç¾ä¸äººä½¿ç¨äºå åå¹´ç弿ºé¡¹ç®ä¸ï¼ä¹å¯è½çªç¶è¢«åç°äºä¸ä¸ªæ¼æ´ï¼å¹¶å¯¼è´å¯æçé»å®¢å ¥ä¾µã
卿们çä¾åä¸ï¼try...catch æ¨å¨æè·âæ°æ®ä¸æ£ç¡®âç errorãä½å®é
ä¸ï¼catch 伿è·å° ææ æ¥èªäº try ç errorãå¨è¿å¿ï¼å®æè·å°äºä¸ä¸ªé¢æä¹å¤ç errorï¼ä½ä»ç¶æåºçæ¯åæ ·ç "JSON Error" ä¿¡æ¯ãè¿æ¯ä¸æ£ç¡®çï¼å¹¶ä¸ä¹ä¼ä½¿ä»£ç å徿´é¾ä»¥è°è¯ã
为äºé¿å æ¤ç±»é®é¢ï¼æä»¬å¯ä»¥éç¨âéæ°æåºâææ¯ãè§åå¾ç®åï¼
catch åºè¯¥åªå¤çå®ç¥éç errorï¼å¹¶âæåºâææå
¶ä» errorã
â忬¡æåºï¼rethrowingï¼âææ¯å¯ä»¥è¢«æ´è¯¦ç»å°è§£é为ï¼
- Catch æè·ææ errorã
- å¨
catch (err) {...}åä¸ï¼æä»¬å¯¹ error 对象errè¿è¡åæã - 妿æä»¬ä¸ç¥éå¦ä½å¤çå®ï¼é£æä»¬å°±
throw errã
éå¸¸ï¼æä»¬å¯ä»¥ä½¿ç¨ instanceof æä½ç¬¦å¤æé误类åï¼
try {
user = { /*...*/ };
} catch (err) {
if (err instanceof ReferenceError) {
alert('ReferenceError'); // 访é®ä¸ä¸ªæªå®ä¹ï¼undefinedï¼çåé产çäº "ReferenceError"
}
}
æä»¬è¿å¯ä»¥ä» err.name 屿§ä¸è·åé误çç±»åãææåççéè¯¯é½æè¿ä¸ªå±æ§ãå¦ä¸ç§æ¹å¼æ¯è¯»å err.constructor.nameã
å¨ä¸é¢ç代ç ä¸ï¼æä»¬ä½¿ç¨â忬¡æåºâï¼ä»¥è¾¾å°å¨ catch ä¸åªå¤ç SyntaxError çç®çï¼
let json = '{ "age": 30 }'; // ä¸å®æ´çæ°æ®
try {
let user = JSON.parse(json);
if (!user.name) {
throw new SyntaxError("æ°æ®ä¸å
¨ï¼æ²¡æ name");
}
blabla(); // 颿ä¹å¤ç error
alert( user.name );
} catch (err) {
if (err instanceof SyntaxError) {
alert( "JSON Error: " + err.message );
} else {
throw err; // 忬¡æåº (*)
}
}
妿 (*) æ è®°çè¿è¡ catch åä¸ç error ä» try...catch ä¸âæäºåºæ¥âï¼é£ä¹å®ä¹å¯ä»¥è¢«å¤é¨ç try...catch ç»æï¼å¦æåå¨ï¼æè·å°ï¼å¦æå¤é¨ä¸åå¨è¿ç§ç»æï¼é£ä¹èæ¬å°±ä¼è¢«ææ»ã
æä»¥ï¼catch åå®é
ä¸åªå¤çå®ç¥é该å¦ä½å¤çç errorï¼å¹¶âè·³è¿âææå
¶ä»ç errorã
ä¸é¢è¿ä¸ªç¤ºä¾æ¼ç¤ºäºè¿ç§ç±»åç error æ¯å¦ä½è¢«å¦å¤ä¸çº§ try...catch æè·çï¼
function readData() {
let json = '{ "age": 30 }';
try {
// ...
blabla(); // error!
} catch (err) {
// ...
if (!(err instanceof SyntaxError)) {
throw err; // 忬¡æåºï¼ä¸ç¥éå¦ä½å¤çå®ï¼
}
}
}
try {
readData();
} catch (err) {
alert( "External catch got: " + err ); // æè·äºå®ï¼
}
ä¸é¢è¿ä¸ªä¾åä¸ç readData åªç¥éå¦ä½å¤ç SyntaxErrorï¼èå¤é¨ç try...catch ç¥éå¦ä½å¤çä»»æç errorã
tryâ¦catchâ¦finally
çä¸ä¸ï¼ä»¥ä¸å¹¶ä¸æ¯ææå 容ã
try...catch ç»æå¯è½è¿æä¸ä¸ªä»£ç åå¥ï¼clauseï¼ï¼finallyã
妿å®åå¨ï¼å®å¨æææ åµä¸é½ä¼è¢«æ§è¡ï¼
tryä¹åï¼å¦ææ²¡æ errorï¼catchä¹åï¼å¦ææ errorã
该æ©å±è¯æ³å¦ä¸æç¤ºï¼
try {
... å°è¯æ§è¡ç代ç ...
} catch (err) {
... å¤ç error ...
} finally {
... æ»æ¯ä¼æ§è¡ç代ç ...
}
è¯è¯è¿è¡è¿æ®µä»£ç ï¼
try {
alert( 'try' );
if (confirm('Make an error?')) BAD_CODE();
} catch (err) {
alert( 'catch' );
} finally {
alert( 'finally' );
}
è¿æ®µä»£ç æä¸¤ç§æ§è¡æ¹å¼ï¼
- å¦æä½ å¯¹äº âMake an error?â çåçæ¯ âYesâï¼é£ä¹æ§è¡
try -> catch -> finallyã - å¦æä½ çåçæ¯ âNoâï¼é£ä¹æ§è¡
try -> finallyã
finally åå¥ï¼clauseï¼é常ç¨å¨ï¼å½æä»¬å¼å§åæäºçæ¶åï¼å¸ææ 论åºç°ä»ä¹æ
åµé½è¦å®ææä¸ªä»»å¡ã
ä¾å¦ï¼æä»¬æ³è¦æµéä¸ä¸ªææ³¢é£å¥æ°å彿° fib(n) æ§è¡æéè¦è±è´¹çæ¶é´ãéå¸¸ï¼æä»¬å¯ä»¥å¨è¿è¡å®ä¹åå¼å§æµéï¼å¹¶å¨è¿è¡å®ææ¶ç»ææµéã使¯ï¼å¦æå¨è¯¥å½æ°è°ç¨æé´åºç° error 该æä¹åï¼ç¹å«æ¯ï¼ä¸é¢è¿æ®µ fib(n) çå®ç°ä»£ç å¨éå°è´æ°æéæ´æ°æ°åæ¶ä¼è¿åä¸ä¸ª errorã
æ 论å¦ä½ï¼finally åå¥é½æ¯ä¸ä¸ªç»ææµéç好尿¹ã
å¨è¿å¿ï¼finally è½å¤ä¿è¯å¨ä¸¤ç§æ
åµä¸é½è½æ£ç¡®å°æµéæ¶é´ ââ æåæ§è¡ fib 以å fib ä¸åºç° error æ¶ï¼
let num = +prompt("è¾å
¥ä¸ä¸ªæ£æ´æ°ï¼", 35)
let diff, result;
function fib(n) {
if (n < 0 || Math.trunc(n) != n) {
throw new Error("ä¸è½æ¯è´æ°ï¼å¹¶ä¸å¿
é¡»æ¯æ´æ°ã");
}
return n <= 1 ? n : fib(n - 1) + fib(n - 2);
}
let start = Date.now();
try {
result = fib(num);
} catch (err) {
result = 0;
} finally {
diff = Date.now() - start;
}
alert(result || "åºç°äº error");
alert( `æ§è¡è±è´¹äº ${diff}ms` );
ä½ å¯ä»¥éè¿è¿è¡ä¸é¢è¿æ®µä»£ç å¹¶å¨ prompt å¼¹çªä¸è¾å
¥ 35 æ¥è¿è¡æ£æ¥ ââ 代ç è¿è¡æ£å¸¸ï¼å
æ§è¡ try ç¶åæ¯ finallyãå¦æä½ è¾å
¥çæ¯ -1 ââ å°ç«å³åºç° errorï¼æ§è¡å°åªè±è´¹ 0msã以ä¸ä¸¤ç§æ
åµä¸çæ¶é´æµé齿£ç¡®å°å®æäºã
æ¢å¥è¯è¯´ï¼å½æ° fib 以 return è¿æ¯ throw 宿齿 å
³ç´§è¦ãå¨è¿ä¸¤ç§æ
åµä¸é½ä¼æ§è¡ finally åå¥ã
try...catch...finally ä¸çå±é¨åé请注æï¼ä¸é¢ä»£ç ä¸ç result å diff åé齿¯å¨ try...catch ä¹å 声æçã
å¦åï¼å¦ææä»¬ä½¿ç¨ let å¨ try åä¸å£°æåéï¼é£ä¹è¯¥åéå°åªå¨ try åä¸å¯è§ã
finally å returnfinally åå¥éç¨äº try...catch ç ä»»ä½ åºå£ãè¿å
æ¬æ¾å¼ç returnã
å¨ä¸é¢è¿ä¸ªä¾åä¸ï¼å¨ try 䏿ä¸ä¸ª returnãå¨è¿ç§æ
åµä¸ï¼finally ä¼å¨æ§å¶è½¬åå¤é¨ä»£ç å被æ§è¡ã
function func() {
try {
return 1;
} catch (err) {
/* ... */
} finally {
alert( 'finally' );
}
}
alert( func() ); // å
æ§è¡ finally ä¸ç alertï¼ç¶åæ§è¡è¿ä¸ª alert
try...finally没æ catch åå¥ç try...finally ç»æä¹å¾æç¨ã彿们䏿³å¨åå°å¤ç errorï¼è®©å®ä»¬æåºå»å§ï¼ï¼ä½æ¯éè¦ç¡®ä¿æä»¬å¯å¨çå¤çéè¦è¢«å®ææ¶ï¼æä»¬åºå½ä½¿ç¨å®ã
function func() {
// å¼å§æ§è¡éè¦è¢«å®æçæä½ï¼æ¯å¦æµéï¼
try {
// ...
} finally {
// 宿å颿们éè¦å®æçé£ä»¶äºï¼å³ä½¿ try ä¸çæ§è¡å¤±è´¥äº
}
}
ä¸é¢ç代ç ä¸ï¼ç±äºæ²¡æ catchï¼æä»¥ try ä¸ç error æ»æ¯ä¼ä½¿ä»£ç æ§è¡è·³è½¬è³å½æ° func() å¤ã使¯ï¼å¨è·³åºä¹åéè¦æ§è¡ finally ä¸ç代ç ã
å ¨å± catch
è¿ä¸ªé¨åçå 容并䏿¯ JavaScript æ ¸å¿çä¸é¨åã
设æ³ä¸ä¸ï¼å¨ try...catch ç»æå¤æä¸ä¸ªè´å½ç errorï¼ç¶åèæ¬æ»äº¡äºãè¿ä¸ª error å°±åç¼ç¨é误æå
¶ä»å¯æçäºå¿é£æ ·ã
æä»ä¹åæ³å¯ä»¥ç¨æ¥åºå¯¹è¿ç§æ åµåï¼æä»¬å¯è½æ³è¦è®°å½è¿ä¸ª errorï¼å¹¶åç¨æ·æ¾ç¤ºæäºå 容ï¼éå¸¸ç¨æ·çä¸å°é误信æ¯ï¼çã
è§è䏿²¡æç¸å
³å
容ï¼ä½æ¯ä»£ç çæ§è¡ç¯å¢ä¸è¬ä¼æä¾è¿ç§æºå¶ï¼å 为å®ç¡®å®å¾æç¨ãä¾å¦ï¼Node.JS æ process.on("uncaughtException")ã卿µè§å¨ä¸ï¼æä»¬å¯ä»¥å°ä¸ä¸ªå½æ°èµå¼ç»ç¹æ®ç window.onerror 屿§ï¼è¯¥å½æ°å°å¨åçæªæè·ç error æ¶æ§è¡ã
è¯æ³å¦ä¸ï¼
window.onerror = function(message, url, line, col, error) {
// ...
};
message- error ä¿¡æ¯ã
url- åç error çèæ¬ç URLã
lineï¼col- åç error å¤ç代ç çè¡å·ååå·ã
error- 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 çä½ç¨é叏䏿¯æ¢å¤èæ¬çæ§è¡ ââ 妿åçç¼ç¨éè¯¯ï¼æ¢å¤èæ¬çæ§è¡å 乿¯ä¸å¯è½çï¼å®çä½ç¨æ¯å°é误信æ¯åéç»å¼åè
ã
乿é对è¿ç§æ åµæä¾ error æ¥å¿ç Web æå¡ï¼ä¾å¦ https://errorception.com æ http://www.muscula.comã
å®ä»¬ä¼åè¿æ ·è¿è¡ï¼
- æä»¬æ³¨å该æå¡ï¼å¹¶æ¿å°ä¸æ®µ JavaScript 代ç ï¼æèæ¬ç URLï¼ï¼ç¶åæå ¥å°é¡µé¢ä¸ã
- 该 JavaScript èæ¬è®¾ç½®äºèªå®ä¹ç
window.onerror彿°ã - å½åç error æ¶ï¼å®ä¼åéä¸ä¸ªæ¤ error ç¸å ³çç½ç»è¯·æ±å°æå¡æä¾æ¹ã
- æä»¬å¯ä»¥ç»å½å°æå¡æ¹ç Web ç颿¥æ¥çè¿äº errorã
æ»ç»
try...catch ç»æå
许æä»¬å¤çæ§è¡è¿ç¨ä¸åºç°ç errorãä»åé¢ä¸çï¼å®å
许âå°è¯âè¿è¡ä»£ç å¹¶âæè·âå
¶ä¸å¯è½åçç errorã
è¯æ³å¦ä¸ï¼
try {
// æ§è¡æ¤å¤ä»£ç
} catch (err) {
// 妿åç errorï¼è·³è½¬è³æ¤å¤
// err æ¯ä¸ä¸ª error 对象
} finally {
// æ è®ºææ ·é½ä¼å¨ try/catch ä¹åæ§è¡
}
è¿å¿å¯è½ä¼æ²¡æ catch æè
没æ finallyï¼æä»¥ try...catch æ try...finally 齿¯å¯ç¨çã
Error 对象å å«ä¸å屿§ï¼
messageââ 人类å¯è¯»ç error ä¿¡æ¯ãnameââ å ·æ error åç§°çå符串ï¼Error æé å¨çåç§°ï¼ãstackï¼æ²¡ææ åï¼ä½å¾å°äºå¾å¥½çæ¯æï¼ââ Error åçæ¶çè°ç¨æ ã
妿æä»¬ä¸éè¦ error å¯¹è±¡ï¼æä»¬å¯ä»¥éè¿ä½¿ç¨ catch { è䏿¯ catch (err) { æ¥çç¥å®ã
æä»¬ä¹å¯ä»¥ä½¿ç¨ throw æä½ç¬¦æ¥çæèªå®ä¹ç errorã仿æ¯ä¸è®²ï¼throw çåæ°å¯ä»¥æ¯ä»»ä½ä¸è¥¿ï¼ä½é常æ¯ç»§æ¿èªå
建ç Error ç±»ç error 对象ãä¸ä¸ç« æä»¬ä¼è¯¦ç»ä»ç»æ©å± errorã
忬¡æåºï¼rethrowingï¼æ¯ä¸ç§é误å¤ççéè¦æ¨¡å¼ï¼catch åé常ææå¹¶ç¥éå¦ä½å¤çç¹å®ç error ç±»åï¼å æ¤å®åºè¯¥å次æåºå®ä¸ç¥éç errorã
å³ä½¿æä»¬æ²¡æ try...catchï¼å¤§å¤æ°æ§è¡ç¯å¢ä¹å
许æä»¬è®¾ç½®âå
¨å±â error å¤çç¨åºæ¥æè·âæåºï¼fall outï¼âç errorã卿µè§å¨ä¸ï¼å°±æ¯ window.onerrorã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼