ì무리 íë¡ê·¸ëë°ì ë¥í ì¬ëì´ëë¼ë ìë¬ê° ìë ì¤í¬ë¦½í¸ë¥¼ ìì±í ì ììµëë¤. ìì¸ì ìë§ë ì¤ì, ììì¹ ëª»í ì¬ì©ì ì ë ¥, ì못ë ìë² ìëµ ë±ì ìì²ë§ ê°ì§ ì´ì ëë¬¸ì¼ ê²ëë¤.
ìë¬ê° ë°ìíë©´ ì¤í¬ë¦½í¸ë âì£½ê³ â(ì¦ì ì¤ë¨ëê³ ), ì½ìì ìë¬ê° ì¶ë ¥ë©ëë¤.
ê·¸ë¬ë try..catch 문ë²ì ì¬ì©íë©´ ì¤í¬ë¦½í¸ê° 죽ë 걸 ë°©ì§íê³ , ìë¬ë¥¼ âì¡ìì(catch)â ë í©ë¹í 무ì¸ê°ë¥¼ í ì ìê² ë©ëë¤.
âtryâ¦catchâ 문ë²
âtryâ¦catchâ 문ë²ì 'tryâì 'catchâë¼ë ë ê°ì 주ì ë¸ë¡ì¼ë¡ 구ì±ë©ëë¤.
try {
// ì½ë...
} catch (err) {
// ìë¬ í¸ë¤ë§
}
tryâ¦catch ëì ìê³ ë¦¬ì¦ì ë¤ìê³¼ ê°ìµëë¤.
- 먼ì ,
try {...}ìì ì½ëê° ì¤íë©ëë¤. - ìë¬ê° ìë¤ë©´,
tryìì ë§ì§ë§ ì¤ê¹ì§ ì¤íëê³ ,catchë¸ë¡ì ê±´ëëëë¤. - ìë¬ê° ìë¤ë©´,
tryì ì½ëì ì¤íì´ ì¤ë¨ëê³ ,catch(err)ë¸ë¡ì¼ë¡ ì ì´ íë¦ì´ ëì´ê°ëë¤. ë³ìerr(ì무 ì´ë¦ì´ë ì¬ì© ê°ë¥)ë ë¬´ì¨ ì¼ì´ ì¼ì´ë¬ëì§ì ëí ì¤ëª ì´ ë´ê¸´ ìë¬ ê°ì²´ë¥¼ í¬í¨í©ëë¤.
ì´ë ê² try {â¦} ë¸ë¡ ììì ìë¬ê° ë°ìí´ë catchìì ìë¬ë¥¼ ì²ë¦¬í기 ë문ì ì¤í¬ë¦½í¸ë ì£½ì§ ììµëë¤.
ìì를 ì´í´ë´ ìë¤.
-
ìë¬ê° ìë ìì:
(1)ê³¼(2)를alertì°½ì ë³´ì¬ì¤try { alert('try ë¸ë¡ ìì'); // (1) <-- // ...ìë¬ê° ììµëë¤. alert('try ë¸ë¡ ë'); // (2) <-- } catch(err) { alert('ìë¬ê° ìì¼ë¯ë¡, catchë 무ìë©ëë¤.'); // (3) } -
ìë¬ê° ìë ìì:
(1)ê³¼(3)ì ë³´ì¬ì¤ëë¤.try { alert('try ë¸ë¡ ìì'); // (1) <-- lalala; // ìë¬, ë³ìê° ì ìëì§ ìì! alert('try ë¸ë¡ ë(ì ë ëë¬íì§ ìì)'); // (2) } catch(err) { alert(`ìë¬ê° ë°ìíìµëë¤!`); // (3) <-- }
try..catchë ì¤ì§ ë°íì ìë¬ìë§ ëìí©ëë¤.try..catchë ì¤í ê°ë¥í(runnable) ì½ëìë§ ëìí©ëë¤. ì¤í ê°ë¥í ì½ëë ì í¨í ìë°ì¤í¬ë¦½í¸ ì½ë를 ì미í©ëë¤.
ì¤ê´í¸ ì§ì´ ì ë§ë ê²ì²ë¼ ì½ëê° ë¬¸ë²ì ì¼ë¡ ì못ë ê²½ì°ì try..catchê° ëìíì§ ììµëë¤.
try {
{{{{{{{{{{{{
} catch(e) {
alert("ì í¨íì§ ìì ì½ëì´ê¸° ë문ì, ìë°ì¤í¬ë¦½í¸ ìì§ì ì´ ì½ë를 ì´í´í ì ììµëë¤.");
}
ìë°ì¤í¬ë¦½í¸ ìì§ì ì½ë를 ì½ê³ ë í ì½ë를 ì¤íí©ëë¤. ì½ë를 ì½ë ì¤ì ë°ìíë ìë¬ë 'parse-time ìë¬âë¼ê³ ë¶ë¥´ëë°, ìì§ì ì´ ì½ë를 ì´í´í ì ì기 ë문ì parse-time ìë¬ë ì½ë ììì ë³µêµ¬ê° ë¶ê°ë¥í©ëë¤.
try..catchë ì í¨í ì½ëìì ë°ìíë ìë¬ë§ ì²ë¦¬í ì ììµëë¤. ì´ë° ìë¬ë¥¼ âë°íì ìë¬(runtime error)â í¹ì 'ìì¸(exception)'ë¼ê³ ë¶ë¦
ëë¤.
try..catchë ë기ì ì¼ë¡ ëìí©ëë¤.setTimeoutì²ë¼ âì¤ì¼ì¤ ë(scheduled)â ì½ëìì ë°ìí ìì¸ë try..catchìì ì¡ìë¼ ì ììµëë¤.
try {
setTimeout(function() {
noSuchVariable; // ì¤í¬ë¦½í¸ë ì¬ê¸°ì 죽ìµëë¤.
}, 1000);
} catch (e) {
alert( "ìë ë©ì¶¤" );
}
setTimeoutì ëê²¨ì§ ìµëª
í¨ìë ìì§ì´ try..catch를 ë ë ë¤ìììì¼ ì¤íë기 ë문ì
ëë¤.
ì¤ì¼ì¤ ë í¨ì ë´ë¶ì ìì¸ë¥¼ ì¡ì¼ë ¤ë©´, try..catch를 ë°ëì í¨ì ë´ë¶ì 구íí´ì¼ í©ëë¤.
setTimeout(function() {
try {
noSuchVariable; // ì´ì try..catchìì ìë¬ë¥¼ í¸ë¤ë§ í ì ììµëë¤!
} catch {
alert( "ìë¬ë¥¼ ì¡ììµëë¤!" );
}
}, 1000);
ìë¬ ê°ì²´
ìë¬ê° ë°ìíë©´ ìë°ì¤í¬ë¦½í¸ë ìë¬ ìì¸ë´ì©ì´ ë´ê¸´ ê°ì²´ë¥¼ ìì±í©ëë¤. ê·¸ í, catch ë¸ë¡ì ì´ ê°ì²´ë¥¼ ì¸ìë¡ ì ë¬í©ëë¤.
try {
// ...
} catch(err) { // <-- 'ìë¬ ê°ì²´', err ëì ë¤ë¥¸ ì´ë¦ì¼ë¡ë ì¸ ì ìì
// ...
}
ë´ì¥ ìë¬ ì ì²´ì ìë¬ ê°ì²´ë ë ê°ì§ 주ì íë¡í¼í°ë¥¼ ê°ì§ëë¤.
name- ìë¬ ì´ë¦. ì ìëì§ ìì ë³ì ë문ì ë°ìí ìë¬ë¼ë©´
"ReferenceError"ê° ì´ë¦ì´ ë©ëë¤. message- ìë¬ ìì¸ ë´ì©ì ë´ê³ ìë 문ì ë©ìì§
íì¤ì ìëì§ë§, nameê³¼ message ì´ì¸ì ëë¶ë¶ì í¸ì¤í¸ íê²½ìì ì§ìíë íë¡í¼í°ë ììµëë¤. stackì ê°ì¥ ë리 ì¬ì©ëë ë¹íì¤ íë¡í¼í° ì¤ íëì
ëë¤.
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ê° ì¤ë¬´ìì ì´ë»ê² ì¬ì©ëëì§ ììë´
ìë¤.
ìì JSONì¼ë¡ ì¸ì½ë©ë ê°ì ì½ì ì ìëë¡ í´ì£¼ë JSON.parse(str) ë©ìëì ëí´ ë°°ì´ ë° ììµëë¤.
ì´ ë©ìëë ì£¼ë¡ ìë² ë±ìì ë¤í¸ìí¬ë¥¼ íµí´ ì ë¬ë°ì ë°ì´í°ë¥¼ ëì½ë©íë ë° ì¬ì©í©ëë¤.
ì ë¬ë°ì ë°ì´í°ì JSON.parse를 í¸ì¶íë ìì¼ë¡ ì¬ì©ëì£ .
let json = '{"name":"John", "age": 30}'; // ìë²ë¡ë¶í° ì ë¬ë°ì ë°ì´í°
let user = JSON.parse(json); // ì ë¬ë°ì 문ìì´ì ìë°ì¤í¬ë¦½í¸ ê°ì²´ë¡ ë³í
// 문ìì´ ííë¡ ì ë¬ë°ì userê° íë¡í¼í°ë¥¼ ê°ì§ ê°ì²´ê° ë¨
alert( user.name ); // John
alert( user.age ); // 30
JSONì ê´í ìì¸í ì ë³´ë JSONê³¼ ë©ìë ì±í°ìì ì½ì´ë³´ì기 ë°ëëë¤.
ì못ë íìì jsonì´ ë¤ì´ì¨ ê²½ì°, JSON.parseë ìë¬ë¥¼ ë§ë¤ê¸° ë문ì ì¤í¬ë¦½í¸ê° â죽ìµëë¤â.
ì¤í¬ë¦½í¸ê° 죽ë ê²ì ë§ì¡±í´ì¼ í ê¹ì? ë¹ì°í ìëì£ !
ìë²ìì ì ë¬ë°ì ë°ì´í°ê° ì못ëì´ ì¤í¬ë¦½í¸ê° 죽ë ê²½ì°, ì¬ì©ìë ê°ë°ì ì½ìì ì´ì§ ìë ì´ì ì ë ìì¸ì ì ì ììµëë¤. ê·¸ë°ë° ì¬ëë¤ì ë©ìì§ ë±ì íµí´ ìë¬ì ìì¸ì ìì§ ëª»í ì± ë¬´ì¸ê°ê° 'ê·¸ë¥ ì£½ë ê²âì ì ë§ ì«ì´í©ëë¤.
try..catch를 ì¬ì©í´ ì´ë¥¼ ì²ë¦¬í´ ë´
ìë¤.
let json = "{ bad json }";
try {
let user = JSON.parse(json); // <-- ì¬ê¸°ì ìë¬ê° ë°ìíë¯ë¡
alert( user.name ); // ì´ ì½ëë ëìíì§ ììµëë¤.
} catch (e) {
// ìë¬ê° ë°ìíë©´ ì ì´ íë¦ì´ catch 문ì¼ë¡ ëì´ìµëë¤.
alert( "ë°ì´í°ì ìë¬ê° ìì´ ì¬ìì²ì ìëí©ëë¤." );
alert( e.name );
alert( e.message );
}
ì ìììì ìë¬ê° ë°ìíë¤ë 걸 ë³´ì¬ì£¼ê¸° ìí´ ê°ë¨í ìì¸ì²ë¦¬íì§ë§, catch ë¸ë¡ ììì ìë¡ì´ ë¤í¸ìí¬ ìì² ë³´ë´ê¸°, ì¬ì©ììê² ëì ì ìí기, ë¡ê¹
ì¥ì¹ì ìë¬ ì ë³´ ë³´ë´ê¸° ë±ê³¼ ê°ì 구체ì ì¸ ì¼ì í ì ììµëë¤. ì¤í¬ë¦½í¸ê° 죽ëë¡ ëëë ê²ë³´ë¤ í¨ì¬ ëì ëìì´ì£ .
ì§ì ìë¬ë¥¼ ë§ë¤ì´ì ëì§ê¸°
jsonì´ ë¬¸ë²ì ì¼ë¡ ì못ëì§ ììì§ë§, ì¤í¬ë¦½í¸ ë´ìì ì¬ì© ì¤ì¸ íì íë¡í¼í° nameì ê°ì§ê³ ìì§ ìë¤ë©´ ë¬´ì¨ ì¼ì´ ì길ê¹ì?
ë¤ìì²ë¼ ë§ì´ì£ .
let json = '{ "age": 30 }'; // ë¶ìì í ë°ì´í°
try {
let user = JSON.parse(json); // <-- ìë¬ ìì
alert( user.name ); // ì´ë¦ì´ ììµëë¤!
} catch (e) {
alert( "ì¤íëì§ ììµëë¤." );
}
ì ìììì JSON.parseë ì ìì ì¼ë¡ ì¤íëìì§ë§ nameì´ ìë ê±´ ìë¬ë¥¼ ì ë°íë ìí©ì
ëë¤.
ì´ì throw ì°ì°ì를 ì¬ì©í´ ìë¬ ì²ë¦¬ë¥¼ íµí©í´ ë³´ëë¡ íê² ìµëë¤.
âthrowâ ì°ì°ì
throw ì°ì°ìë ìë¬ë¥¼ ìì±í©ëë¤.
문ë²ì ë¤ìê³¼ ê°ìµëë¤.
throw <error object>
ì´ë¡ ì ì¼ë¡ë ì«ì, 문ìì´ ê°ì ììí ìë£ë¥¼ í¬í¨í ì´ë¤ ê²ì´ë ìë¬ ê°ì²´(error object)ë¡ ì¬ì©í ì ììµëë¤. íì§ë§ ë´ì¥ ìë¬ìì í¸íì ìí´ ëëë¡ ìë¬ ê°ì²´ì nameê³¼ message íë¡í¼í°ë¥¼ ë£ì´ì£¼ë ê²ì ê¶ì¥í©ëë¤.
ìë°ì¤í¬ë¦½í¸ë 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("ì´ìí ì¼ì´ ë°ìíìµëë¤. o_O");
alert(error.name); // Error
alert(error.message); // ì´ìí ì¼ì´ ë°ìíìµëë¤. o_O
ì못ë ë°ì´í°ë¥¼ ë°ìì ë, JSON.parseê° ì´ë¤ ì¢
ë¥ì ìë¬ë¥¼ ë§ë¤ì´ë´ëì§ ìë ì½ë를 íµí´ ì´í´ë´
ìë¤.
try {
JSON.parse("{ ì못ë íìì json o_O }");
} catch(e) {
alert(e.name); // SyntaxError
alert(e.message); // Unexpected token b in JSON at position 2
}
SyntaxErrorê° ë°ìíë¤ì.
ì¬ì©ì를 ëíë´ë ê°ì²´ì name íë¡í¼í°ë ë°ëì ìì´ì¼ íë¯ë¡, ì´ì nameì´ ìì¼ë©´ ìë¬ê° ë°ìí ê²ì¼ë¡ ê°ì£¼íê³ ìì¸ ì²ë¦¬í´ë´
ìë¤.
throw ì°ì°ì를 ì¬ì©í´ ìë¬ë¥¼ ëì ¸ë³´ê² ìµëë¤.
let json = '{ "age": 30 }'; // ë¶ìì í ë°ì´í°
try {
let user = JSON.parse(json); // <-- ìë¬ ìì
if (!user.name) {
throw new SyntaxError("ë¶ìì í ë°ì´í°: ì´ë¦ ìì"); // (*)
}
alert( user.name );
} catch(e) {
alert( "JSON Error: " + e.message ); // JSON Error: ë¶ìì í ë°ì´í°: ì´ë¦ ìì
}
(*)ë¡ íìí ì¤ìì throw ì°ì°ìë message를 ì´ì©í´ SyntaxError를 ìì±í©ëë¤. ìë¬ ìì± ë°©ìì ìë°ì¤í¬ë¦½í¸ê° ìì²´ì ì¼ë¡ ìë¬ë¥¼ ìì±íë ë°©ìê³¼ ëì¼í©ëë¤. ìë¬ê° ë°ìíì¼ë¯ë¡ tryì ì¤íì ì¦ì ì¤ë¨ëê³ ì ì´ íë¦ì´ catchë¡ ëì´ê° ê²ì ì¼ë¿ ì°½ì íµí´ íì¸í ì ìë¤ì.
ì´ì JSON.parseìì ìë¬ê° ë°ìí ê²½ì°ë¥¼ í¬í¨í´ì 모ë ìë¬ë¥¼ catch ë¸ë¡ ììì ì²ë¦¬í ì ìê² ëììµëë¤.
ìë¬ ë¤ì ëì§ê¸°
ì ìììì ë¶ìì í ë°ì´í°ë¥¼ 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 Errorê° ìëëë¤.)
}
ìë¬ë ì´ë¤ ìí©ììë ë°ìí ì ììµëë¤! ëªì ë ê° ëªë°±ë§ ëª ì´ ì¬ì©í ì¤íìì¤ ì í¸ë¦¬í°ììë ëì°í í´í¹ì¼ë¡ ì´ì´ì§ ì ìë ìì²ë ë²ê·¸ê° ë°ê²¬ëì£ .
ììì 'ë¶ìì í ë°ì´í°â를 ë¤ë£¨ë ¤ë 목ì ì¼ë¡ try..catch를 ì¼ìµëë¤. ê·¸ë°ë° catchë ìë try ë¸ë¡ìì ë°ìí 모ë ìë¬ë¥¼ ì¡ì¼ë ¤ë 목ì ì¼ë¡ ë§ë¤ì´ì¡ìµëë¤. ê·¸ë°ë° ì ìììì catchë ììì¹ ëª»í ìë¬ë¥¼ ì¡ìë´ ì£¼ê¸´ íì§ë§, ìë¬ ì¢
ë¥ì ê´ê³ìì´ "JSON Error" ë©ìì§ë¥¼ ë³´ì¬ì¤ëë¤. ì´ë ê² ìë¬ ì¢
ë¥ì ê´ê³ìì´ ëì¼í ë°©ìì¼ë¡ ìë¬ë¥¼ ì²ë¦¬íë ê²ì ëë²ê¹
ì ì´ë µê² ë§ë¤ê¸° ë문ì ì¢ì§ ììµëë¤.
ì´ë° 문ì 를 í¼íê³ ì âë¤ì ëì§ê¸°(rethrowing)â 기ì ì ì¬ì©í©ëë¤. ê·ì¹ì ê°ë¨í©ëë¤.
catchë ìê³ ìë ìë¬ë§ ì²ë¦¬íê³ ë머ì§ë âë¤ì ëì ¸ì¼â í©ëë¤.
âë¤ì ëì§ê¸°â 기ì ì ë ìì¸í ì¤ëª íê² ìµëë¤.
- catchê° ëª¨ë ìë¬ë¥¼ ë°ìµëë¤.
catch(err) {...}ë¸ë¡ ììì ìë¬ ê°ì²´err를 ë¶ìí©ëë¤.- ìë¬ ì²ë¦¬ ë°©ë²ì ìì§ ëª»íë©´
throw err를 í©ëë¤.
ë³´íµ ìë¬ íì
ì instanceof ëª
ë ¹ì´ë¡ ì²´í¬í©ëë¤.
try {
user = { /*...*/ };
} catch(err) {
if (err instanceof ReferenceError) {
alert('ReferenceError'); // ì ìëì§ ìì ë³ìì ì ê·¼íì¬ 'ReferenceError' ë°ì
}
}
err.name íë¡í¼í°ë¡ ìë¬ í´ëì¤ ì´ë¦ì ì ìë ììµëë¤. 기본í ìë¬ë 모ë err.name íë¡í¼í°ë¥¼ ê°ì§ëë¤. ëë err.constructor.name를 ì¬ì©í ìë ììµëë¤.
ìë¬ë¥¼ ë¤ì ëì ¸ì catch ë¸ë¡ìì SyntaxErrorë§ ì²ë¦¬ëëë¡ í´ë³´ê² ìµëë¤.
let json = '{ "age": 30 }'; // ë¶ìì í ë°ì´í°
try {
let user = JSON.parse(json);
if (!user.name) {
throw new SyntaxError("ë¶ìì í ë°ì´í°: ì´ë¦ ìì");
}
blabla(); // ììì¹ ëª»í ìë¬
alert( user.name );
} catch(e) {
if (e instanceof SyntaxError) {
alert( "JSON Error: " + e.message );
} else {
throw e; // ìë¬ ë¤ì ëì§ê¸° (*)
}
}
catch ë¸ë¡ ìì (*)ë¡ íìí ì¤ìì ë¤ì ëì ¸ì§(rethrow) ìë¬ë try..catch âë°ì¼ë¡ ëì ¸ì§ëë¤â. ì´ë ë°ê¹¥ì try..catchê° ìë¤ë©´ ì¬ê¸°ì ìë¬ë¥¼ ì¡ìµëë¤. ìëë¼ë©´ ì¤í¬ë¦½í¸ë 죽ì ê²ëë¤.
ì´ë ê² íë©´ catch ë¸ë¡ìì ì´ë»ê² ë¤ë£°ì§ ìê³ ìë ìë¬ë§ ì²ë¦¬íê³ , ì ì ìë ìë¬ë âê±´ëë¸ ìâ ììµëë¤.
ì´ì try..catch를 íë ë ë§ë¤ì´, ë¤ì ëì ¸ì§ ììì¹ ëª»í ìë¬ë¥¼ ì²ë¦¬í´ ë³´ê² ìµëë¤.
function readData() {
let json = '{ "age": 30 }';
try {
// ...
blabla(); // ìë¬!
} catch (e) {
// ...
if (!(e instanceof SyntaxError)) {
throw e; // ì ì ìë ìë¬ ë¤ì ëì§ê¸°
}
}
}
try {
readData();
} catch (e) {
alert( "External catch got: " + e ); // ìë¬ë¥¼ ì¡ì
}
readDataë SyntaxErrorë§ ì²ë¦¬í ì ìì§ë§, í¨ì ë°ê¹¥ì try..catchììë ììì¹ ëª»í ìë¬ë ì²ë¦¬í ì ìê² ëììµëë¤.
tryâ¦catchâ¦finally
ì ê¹! ìë¬ í¸ë¤ë§ì ì¬ê¸°ì ëì´ ìëëë¤.
try..catchë finallyë¼ë ì½ë ì ì íë ë ê°ì§ ì ììµëë¤.
finallyìì ì½ëë ë¤ìê³¼ ê°ì ìí©ìì ì¤íë©ëë¤.
- ìë¬ê° ìë ê²½ì°:
tryì¤íì´ ëë í - ìë¬ê° ìë ê²½ì°:
catchì¤íì´ ëë í
finally를 ì¬ì©íë©´ try..catch를 ë¤ìê³¼ ê°ì´ íì¥í ì ììµëë¤.
try {
... ì½ë를 ì¤í ...
} catch(e) {
... ìë¬ í¸ë¤ë§ ...
} finally {
... íì ì¤í ...
}
ìë ì½ë를 ì¤íí´ë³´ì¸ì.
try {
alert( 'try ë¸ë¡ ìì' );
if (confirm('ìë¬ë¥¼ ë§ëìê² ìµëê¹?')) ì´ìí_ì½ë();
} catch (e) {
alert( 'catch' );
} finally {
alert( 'finally' );
}
ì ì½ëë ë ê°ì§ ê²½ë¡ë¡ ì¤íë©ëë¤.
- "ìë¬ë¥¼ ë§ëìê² ìµëê¹?"ì 'OKâë¡ ëµí ê²½ì°:
try -> catch -> finally - 'Noâë¡ ëµí ê²½ì°:
try -> finally
finally ì ì 무ì¸ê°ë¥¼ ì¤ííê³ , ì¤í ê²°ê³¼ì ìê´ìì´ ì¤íì ìë£íê³ ì¶ì ê²½ì° ì¬ì©ë©ëë¤.
í¼ë³´ëì¹ í¨ì fib(n)ì ì°ì° ìê°ì 측ì íê³ ì¶ë¤ê³ í´ ë´
ìë¤. í¨ì ì¤í ì ì 측ì ì ììí´ì ì¤íì´ ëë í 측ì ì ì¢
ë£íë©´ ëê² ì£ . ê·¸ë°ë° í¨ì ì¤í ëì¤ ìë¬ê° ë°ìíë©´ ì´ë»ê² ë ê¹ì? ìë fib(n)ìë ììë ì ìê° ìë ì를 ì
ë ¥í ê²½ì° ìë¬ê° ë°ìí©ëë¤.
ì´ë° ê²½ì°ì finally를 ì¬ì©í ì ììµëë¤. finally ì ì ë¬´ì¨ ì¼ì´ ì¼ì´ë¬ë ê´ê³ìì´ ì°ì° ìê° ì¸¡ì ì ëë§ì¹ê¸° ì ì í ê³³ì´ì£ .
fib í¨ìê° ìë¬ ìì´ ì ìì ì¼ë¡ ì¤íëë ìë¬ê° ë°ìíë ìê´ìì´, finally를 ì¬ì©íë©´ ì°ì° ìê°ì ì ëë¡ ì¸¡ì í ì ììµëë¤.
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 (e) {
result = 0;
} finally {
diff = Date.now() - start;
}
alert(result || "ìë¬ ë°ì");
alert( `ì°ì° ìê°: ${diff}ms` );
ì½ë를 ì¤ííê³ í롬íí¸ ëíììì 35를 ì
ë ¥íë©´ try ë¤ìì finallyê° ì ìì ì¼ë¡ ì¤íëë©´ì ì°ì° ìê°ì íì¸í ì ììµëë¤. -1ì ì
ë ¥íë©´ ìë¬ê° ë°ìíê³ , ì°ì° ìê°ì 0msê° ë©ëë¤. ë ê²½ì° ëª¨ë ì°ì° ìê°ì´ ì ìì ì¼ë¡ 측ì ëìë¤ì.
í¨ìë return ì´ë throw를 ë§ëë©´ ì¢
ë£ëëë°, ì´ë ê² finally ì ì ì¬ì©íë©´ ë ê²½ì° ëª¨ë를 ì²ë¦¬í ì ììµëë¤.
try..catch..finally ìì ë³ìë ì§ì ë³ìì
ëë¤.ì ìììì ë³ì diffì resultë try..catch ì ì ì ì¸ëìë¤ë ì ì 주ìí´ ì£¼ì¸ì.
try ë¸ë¡ ììì ì ì¸í ë³ìë ë¸ë¡ ìììë§ ì í¨í ì§ì ë³ìê° ë©ëë¤.
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..finally 구문ë ìí©ì ë°ë¼ ì ì©íê² ì¸ ì ììµëë¤. try..finally ììì ìë¬ë¥¼ ì²ë¦¬íê³ ì¶ì§ ìì§ë§, ììí íë¡ì¸ì¤ê° ë§ë¬´ë¦¬ëìëì§ íì¤í íê³ ì¶ì ê²½ì°ì ì¬ì©í©ëë¤.
function func() {
// 무ì¸ê°ë¥¼ 측ì íë ê²½ì°ì ê°ì´ ë맺ìì´ ìì´ì¼ íë íë¡ì¸ì¤
try {
// ...
} finally {
// ì¤í¬ë¦½í¸ê° 죽ëë¼ë ìë£ë¨
}
}
ì ì½ëì catchê° ì기 ë문ì try ììì ë°ìí ìë¬ë íì ë°ì¼ë¡ ë¨ì´ì ¸ ëìµëë¤. finallyë ì¤í íë¦ì´ í¨ì를 ë ë기 ì ì ì¤íë©ëë¤.
ì ì catch
ì´ ì ì ì½ì´ ìë°ì¤í¬ë¦½í¸ê° ìëëë¤.
try..catch ë°ê¹¥ìì ì¹ëª
ì ì¸ ìë¬ê° ë°ìí´ ì¤í¬ë¦½í¸ê° 죽ìë¤ê³ ììí´ë´
ìë¤.
ëì² ë°©ë²ì 무ìì´ ììê¹ì? ì´ëê°ì ìë¬ ë´ìì 기ë¡í´ ëê±°ë ì¬ì©ììê² ìë¬ê° ë°ìíìì ìë ¤ì£¼ë íì를 í ì ìì ê²ëë¤.
ìë°ì¤í¬ë¦½í¸ ëª
ì¸ììë ì´ë° ì¹ëª
ì ì¸ ìë¬ì ëìíë ë°©ë²ì´ ì íìì§ ììµëë¤. íì§ë§ try..catchìì ì²ë¦¬íì§ ëª»í ìë¬ë¥¼ ì¡ë ê²ì ì주 ì¤ìí기 ë문ì, ìë°ì¤í¬ë¦½í¸ í¸ì¤í¸ íê²½ ëë¤ìë ìì²´ì ì¼ë¡ ìë¬ ì²ë¦¬ 기ë¥ì ì ê³µí©ëë¤. Node.jsì process.on("uncaughtException")ì´ ê·¸ ìì
ëë¤. ë¸ë¼ì°ì íê²½ìì window.onerror를 ì´ì©í´ ìë¬ë¥¼ ì²ë¦¬í ì ììµëë¤. 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ë 죽ì´ë²ë¦° ì¤í¬ë¦½í¸ë¥¼ 복구íë ¤ë 목ì ì¼ë¡ë ì ì¬ì©íì§ ììµëë¤. íë¡ê·¸ëë° ìë¬ê° ë°ìí ê²½ì° window.onerrorë§ì¼ë¡ ì¤í¬ë¦½í¸ë¥¼ 복구íë ê±´ ì¬ì¤ì ë¶ê°ë¥íì£ . window.onerrorë ê°ë°ììê² ìë¬ ë©ìì§ë¥¼ ë³´ë´ë ì©ëë¡ ì¬ì©í©ëë¤.
window.onerrorë§ê³ https://errorception.com ë http://www.muscula.comê°ì ìë¬ ë¡ê¹
ê´ë ¨ ìì© ìë¹ì¤ê° ì¬ë¬ ê°ì§ ììµëë¤.
ì´ë° ìë¹ì¤ë¤ì ë¤ìê³¼ ê°ì íë¡ì¸ì¤ë¡ ëìí©ëë¤.
- ìë¹ì¤ë¥¼ ê°ì íë©´ ìë°ì¤í¬ë¦½í¸ íì¼(í¹ì ì¤í¬ë¦½í¸ url)ì ë°ëë°, ê°ë°ìë ì´ íì¼ì íì´ì§ì ì½ì í©ëë¤.
- ë°ì íì¼ì 커ì¤í
window.onerrorí¨ì를 ì¤ì í©ëë¤. - ìë¬ê° ë°ìíë©´, ì´ ì»¤ì¤í í¨ìê° ìë¬ì ê´í ë´ì©ì ë´ì ìë¹ì¤ì ë¤í¸ìí¬ ìì²ì ë³´ë ëë¤.
- ê°ë°ìë ìë¹ì¤ ì¬ì´í¸ì ë¡ê·¸ì¸í´ 기ë¡ë ìë¬ë¥¼ íì¸í©ëë¤.
ìì½
try..catch를 ì´ì©íë©´ ë°íì ìë¬ë¥¼ ì²ë¦¬í ì ììµëë¤. tryìì ì½ë를 ì¤ííê³ , ìë¬ê° ë°ìíë©´ catchìì ì¡ìë
ëë¤.
문ë²ì ë¤ìê³¼ ê°ìµëë¤.
try {
// ì´ê³³ì ì½ë를 ì¤í
} catch(err) {
// ìë¬ê° ë°ìíë©´, ì¬ê¸°ë¶í° ì¤íë¨
// errë ìë¬ ê°ì²´
} finally {
// ìë¬ ë°ì ì¬ë¶ì ìê´ìì´ try/catch ì´íì ì¤íë¨
}
try..catch, try..catch..finallyì´ì¸ìë try..finally를 ì¬ì©í ì ììµëë¤.
ìë¬ ê°ì²´ì ë¤ìê³¼ ê°ì íë¡í¼í°ê° ììµëë¤.
messageâ ì¬ëì´ ì½ì ì ìë ííì ìë¬ ë©ìì§nameâ ìë¬ ì´ë¦ì ë´ì 문ìì´ (ìë¬ ìì±ì ì´ë¦)stackâ íì¤ì´ ìëì§ë§ ëë¶ë¶ì í¸ì¤í¸ íê²½ì´ ì§ìíë íë¡í¼í°ë¡ ìë¬ê° ë°ìí ìê°ì ì¤íì ëíë
ìë¬ ê°ì²´ê° íì ìì¼ë©´ catch(err) { ëì catch {를 ì¸ ì ììµëë¤.
throw ì°ì°ì를 ì¬ì©íë©´ ìë¬ë¥¼ ì§ì ë§ë¤ ì ììµëë¤. ì´ë¡ ìì¼ë¡ , throw ì¸ìì 모ë ê²ì ë길 ì ìì§ë§, ëê° ë´ì¥ Error í´ëì¤ë¥¼ ììë°ì ìë¬ ê°ì²´ë¥¼ ì¸ìì ëê¹ëë¤. ìë¬ ììì ëí´ì ë¤ì ì±í°ìì ë¤ë£° ìì ì
ëë¤.
ë¤ì ëì§ê¸°ë ìë¬ ì²ë¦¬ ì ì¬ì©ëë ì¤ìí í¨í´ì
ëë¤. catch ë¸ë¡ìì ëê° ììíìê±°ë ì´ë»ê² ë¤ë£°ì§ ìê³ ìë ìë¬ë¥¼ ë¤ë£¨ê³ , ììì¹ ëª»í ìë¬ë ë¤ì ëì§ê¸° í©ëë¤.
try..catchê° ìì´ë ëë¶ë¶ì í¸ì¤í¸ íê²½ì´ âì ìâ ìë¬ í¸ë¤ë¬ë¥¼ ì§ìí기 ë문ì âë¨ì´ì ¸ ëì¨â ìë¬ë¥¼ ì¡ì ì ììµëë¤. window.onerrorë ë¸ë¼ì°ì íê²½ì ì ì ìë¬ í¸ë¤ë¬ì
ëë¤.

ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.