μλ°μ€ν¬λ¦½νΈμμ μμΈ μ²λ¦¬λ μ½λ μ€ν μ€ λ°μν μ μλ μ€λ₯λ₯Ό κ΄λ¦¬νκ³ νλ‘κ·Έλ¨μ΄ κ°μκΈ° μ€λ¨λμ§ μλλ‘ νλ μ€μν λΆλΆμ λλ€. μμΈ μ²λ¦¬λ₯Ό ν΅ν΄ μ¬μ©μ κ²½νμ ν₯μνκ³ νλ‘κ·Έλ¨μ μμ μ±μ λμΌ μ μμ΅λλ€. μ΄λ² ν¬μ€ν μμλ μλ°μ€ν¬λ¦½νΈ μμΈ μ²λ¦¬μ κΈ°λ³Έ κ°λ κ³Ό μ¬μ© λ°©λ²μ μ΄ν΄λ³΄κ² μ΅λλ€.
β£ λͺ©μ°¨
01. μμΈ μ²λ¦¬ κΈ°λ³Έ κ°λ π§©
μλ°μ€ν¬λ¦½νΈ μμΈ(Exception)λ νλ‘κ·Έλ¨ μ€ν μ€μ μκΈ°μΉ μκ² λ°μνλ μ€λ₯ μν©μ μλ―Έν©λλ€. μμΈ μ²λ¦¬λ μ΄λ¬ν μ€λ₯λ₯Ό κ΄λ¦¬νκ³ νλ‘κ·Έλ¨μ΄ λΉμ μμ μΌλ‘ μ’ λ£λλ κ²μ λ°©μ§νκΈ° μν λ°©λ²μ λλ€. μμΈ μ²λ¦¬λ₯Ό ν΅ν΄ μ½λμ μμ μ±μ λμ΄κ³ , μ€λ₯ λ°μ μ μ μ ν μ‘°μΉλ₯Ό μ·¨ν μ μμ΅λλ€.
02. κΈ°λ³Έ ꡬ문π
μλ°μ€ν¬λ¦½νΈμμ μμΈ μ²λ¦¬λ₯Ό μν κΈ°λ³Έ ꡬ문μ try, catch, finally λΈλ‘μ μ¬μ©νλ κ²μ λλ€. κ°κ°μ μν μ λ€μκ³Ό κ°μ΅λλ€.
try {
// μ€λ₯κ° λ°μν κ°λ₯μ±μ΄ μλ μ½λ
} catch (error) {
// μ€λ₯κ° λ°μνμ λ μ€νλ μ½λ
} finally {
// νμ μ€νλ μ½λ (μ ν μ¬ν)
}
try λΈλ‘
- try λΈλ‘ λ΄μ μμΉν μ½λλ μ€λ₯κ° λ°μν κ°λ₯μ±μ΄ μλ μ½λλ₯Ό ν¬ν¨ν©λλ€.
- μ€λ₯κ° λ°μνλ©΄, μλ°μ€ν¬λ¦½νΈλ μ¦μ try λΈλ‘μ λλ¨Έμ§ μ½λλ₯Ό 건λλ°κ³ catch λΈλ‘μ μ€νν©λλ€.
catch λΈλ‘
- catch λΈλ‘μ try λΈλ‘ λ΄μμ μ€λ₯κ° λ°μνμ λ μ€νλ©λλ€.
- catch λΈλ‘μ λ°μν μ€λ₯μ λν μ 보λ₯Ό λ΄κ³ μλ κ°μ²΄(λ³΄ν΅ errorλΌλ λ³μλͺ μΌλ‘ μ¬μ©)λ₯Ό 맀κ°λ³μλ‘ κ°μ§λλ€.
- catch λΈλ‘ λ΄μμ μ€λ₯λ₯Ό μ²λ¦¬νκ±°λ μ¬μ©μμκ² μ€λ₯λ₯Ό μ리λ λ±μ μμ μ μνν μ μμ΅λλ€.
finally λΈλ‘ (μ ν μ¬ν)
- finally λΈλ‘μ try λΈλ‘κ³Ό catch λΈλ‘μ΄ μ€νλ ν νμ μ€νλ©λλ€.
- try λΈλ‘ λ΄μμ μ€λ₯κ° λ°μνλ λ°μνμ§ μλ μκ΄μμ΄ μ€νλ©λλ€.
- μ£Όλ‘ μμ μ 리, μλ₯Ό λ€μ΄ νμΌμ΄λ λ€νΈμν¬ μ°κ²°μ λ«λ μμ λ±μ μ¬μ©λ©λλ€.
03. μμ μ½λ μ€λͺ π»
try {
let result = riskyOperation(); // μ€λ₯κ° λ°μν κ°λ₯μ±μ΄ μλ ν¨μ νΈμΆ
console.log(result);
} catch (error) {
console.error("An error occurred:", error.message);
} finally {
console.log("This will always run, no matter what.");
}
try λΈλ‘
try {
let result = riskyOperation(); // μ€λ₯κ° λ°μν κ°λ₯μ±μ΄ μλ ν¨μ νΈμΆ
console.log(result);
}
- try λΈλ‘ λ΄μ μ½λλ μ€λ₯κ° λ°μν κ°λ₯μ±μ΄ μλ μ½λλ₯Ό ν¬ν¨ν©λλ€.
- μ¬κΈ°μ riskyOperation() ν¨μκ° νΈμΆλλ©°, μ΄ ν¨μκ° μ€νλ λ μ€λ₯κ° λ°μν κ°λ₯μ±μ΄ μμ΅λλ€.
- riskyOperation() ν¨μκ° μ μμ μΌλ‘ μ€νλλ©΄, κ·Έ λ°νκ°μ΄ result λ³μμ μ μ₯λκ³ , console.log(result);μ μν΄ μΆλ ₯λ©λλ€.
- λ§μ½ riskyOperation() ν¨μκ° μ€λ₯λ₯Ό λ°μμν€λ©΄, try λΈλ‘μ λλ¨Έμ§ μ½λλ 건λλ°κ³ catch λΈλ‘μΌλ‘ μ μ΄κ° λμ΄κ°λλ€.
catch λΈλ‘
catch (error) {
console.error("An error occurred:", error.message);
}
- catch λΈλ‘μ try λΈλ‘ λ΄μμ μ€λ₯κ° λ°μνμ λ μ€νλ©λλ€.
- error 맀κ°λ³μλ λ°μν μ€λ₯ κ°μ²΄λ₯Ό μ°Έμ‘°ν©λλ€.
- console.error("An error occurred:", error.message); μ½λλ μ€λ₯ λ©μμ§λ₯Ό μ½μμ μΆλ ₯ν©λλ€.
- μ¬κΈ°μ error.messageλ μ€λ₯ κ°μ²΄μ message μμ±μ μ°Έμ‘°νλ©°, μ΄λ μ€λ₯μ λν μ€λͺ μ μ 곡ν©λλ€.
finally λΈλ‘
finally {
console.log("This will always run, no matter what.");
}
- finally λΈλ‘μ try λΈλ‘κ³Ό catch λΈλ‘μ΄ μ€νλ ν νμ μ€νλ©λλ€.
- try λΈλ‘ λ΄μμ μ€λ₯κ° λ°μνλ λ°μνμ§ μλ μκ΄μμ΄ finally λΈλ‘μ νμ μ€νλ©λλ€.
- μ΄ λΈλ‘μ μ£Όλ‘ μμ μ 리 μμ μ μννλ λ° μ¬μ©λ©λλ€. μλ₯Ό λ€μ΄, νμΌμ΄λ λ€νΈμν¬ μ°κ²°μ λ«λ μμ λ±μ μνν μ μμ΅λλ€.
- μ΄ μμ μμλ λ¨μν "This will always run, no matter what."μ΄λΌλ λ©μμ§λ₯Ό μ½μμ μΆλ ₯ν©λλ€.
λμ μμ
- riskyOperation() ν¨μκ° μ€λ₯λ₯Ό λ°μμν€μ§ μλ κ²½μ°:
- try λΈλ‘μ΄ μ μμ μΌλ‘ μ€νλ©λλ€.
- result λ³μμ riskyOperation() ν¨μμ λ°νκ°μ΄ μ μ₯λκ³ , ν΄λΉ κ°μ΄ μ½μμ μΆλ ₯λ©λλ€.
- finally λΈλ‘μ΄ μ€νλμ΄ "This will always run, no matter what." λ©μμ§κ° μΆλ ₯λ©λλ€.
- riskyOperation() ν¨μκ° μ€λ₯λ₯Ό λ°μμν€λ κ²½μ°:
- try λΈλ‘ λ΄μ μ½λ μ€νμ΄ μ€λ¨λκ³ , catch λΈλ‘μΌλ‘ μ μ΄κ° λμ΄κ°λλ€.
- catch λΈλ‘μ΄ μ€νλμ΄ μ€λ₯ λ©μμ§κ° μ½μμ μΆλ ₯λ©λλ€.
- finally λΈλ‘μ΄ μ€νλμ΄ "This will always run, no matter what." λ©μμ§κ° μΆλ ₯λ©λλ€.
μ΄ μμ λ μλ°μ€ν¬λ¦½νΈμμ μμΈλ₯Ό μ²λ¦¬νμ¬ νλ‘κ·Έλ¨μ΄ μκΈ°μΉ μκ² μ’ λ£λμ§ μλλ‘ νλ λ°©λ²μ 보μ¬μ€λλ€. μμΈ μ²λ¦¬λ₯Ό ν΅ν΄ μ€λ₯κ° λ°μν΄λ νλ‘κ·Έλ¨μ λλ¨Έμ§ λΆλΆμ΄ κ³μ μ€νλ μ μλλ‘ ν μ μμ΅λλ€.
04. 컀μ€ν μμΈ μμ±π οΈ
μλ°μ€ν¬λ¦½νΈ 컀μ€ν μμΈλ₯Ό μμ±νλ λ°©λ²μλ λ κ°μ§ μ£Όμ μ κ·Ό λ°©μμ΄ μμ΅λλ€. νλλ throw ν€μλλ₯Ό μ¬μ©νμ¬ μμΈλ₯Ό λ°μμν€λ λ°©λ²μ΄κ³ , λ€λ₯Έ νλλ Error κ°μ²΄λ₯Ό μμλ°μ μλ‘μ΄ μ€λ₯ ν΄λμ€λ₯Ό μ μνλ λ°©λ²μ λλ€. κ° λ°©λ²μ κ°λ¨ν μ€λͺ ν΄ λ³΄κ² μ΅λλ€.
1. throw ν€μλλ₯Ό μ¬μ©νμ¬ μμΈ λ°μμν€κΈ°
throw ν€μλλ₯Ό μ¬μ©νμ¬ νΉμ 쑰건μ΄λ μν©μμ μμΈλ₯Ό λ°μμν¬ μ μμ΅λλ€. μ΄ λ°©λ²μ μμΈ κ°μ²΄λ₯Ό λ°λ‘ μ μνμ§ μκ³ λ κ°λ¨ν μμΈλ₯Ό μ²λ¦¬ν μ μλ μ₯μ μ΄ μμ΅λλ€. μλ₯Ό λ€μ΄,
function checkNumber(num) {
if (typeof num !== 'number') {
throw new Error("Invalid number: The input should be a number.");
}
return num;
}
try {
let result = checkNumber("not a number");
console.log("Result:", result);
} catch (error) {
console.error("Caught an error:", error.message);
}
μ΄ μμ μμ checkNumber ν¨μλ μ λ ₯μ΄ μ«μκ° μλ κ²½μ° throw new Error(...)λ₯Ό μ¬μ©νμ¬ μμΈλ₯Ό λ°μμν΅λλ€. catch λΈλ‘μμλ μ΄ μμΈλ₯Ό μ‘μμ μ²λ¦¬νκ³ μμ΅λλ€.
2. Error κ°μ²΄λ₯Ό μμλ°μ μλ‘μ΄ μ€λ₯ ν΄λμ€ μ μνκΈ°
λ 볡μ‘νκ±°λ μμ© νλ‘κ·Έλ¨μ νΉμ λλ©μΈμμ μμ£Ό λ°μνλ μμΈλ₯Ό μ²λ¦¬ν΄μΌ ν λλ, Error κ°μ²΄λ₯Ό μμλ°μ μλ‘μ΄ μ€λ₯ ν΄λμ€λ₯Ό μ μνλ κ²μ΄ μ’μ΅λλ€. μ΄ λ°©λ²μ μμΈμ λν νΉνλ λ©μλλ μμ±μ μΆκ°ν μ μλ μ₯μ μ΄ μμ΅λλ€.
class CustomError extends Error {
constructor(message) {
super(message);
this.name = this.constructor.name;
this.date = new Date();
}
// μΆκ°μ μΈ λ©μλ μ μ κ°λ₯
logError() {
console.log(`[${this.date}] ${this.name}: ${this.message}`);
}
}
function processInput(input) {
if (typeof input !== 'string') {
throw new CustomError('InvalidInputError: Input should be a string.');
}
// μ¬κΈ°μλΆν°λ inputμ μ²λ¦¬νλ λ‘μ§μ ν¬ν¨ν μ μμ
console.log('Processing input:', input);
}
try {
processInput(42); // μ ν¨νμ§ μμ μ
λ ₯μ μ λ¬νμ¬ μμΈλ₯Ό λ°μμν΄
} catch (error) {
if (error instanceof CustomError) {
error.logError(); // 컀μ€ν
μ€λ₯ κ°μ²΄μ μΆκ° λ©μλ μ¬μ© μμ
}
console.error('Caught an error:', error.message); // μμΈ μ²λ¦¬
}
μ΄ μμ μμ CustomError ν΄λμ€λ Error κ°μ²΄λ₯Ό μμλ°μ μλ‘μ΄ μ€λ₯ ν΄λμ€λ₯Ό μ μνκ³ μμ΅λλ€. constructor λ©μλμμλ μ€λ₯ μ΄λ¦κ³Ό νμ¬ μκ°μ ν¬ν¨ν μΆκ° μ 보λ₯Ό μ€μ νκ³ μμ΅λλ€. processInput ν¨μμμλ throw new CustomError(...)λ₯Ό μ¬μ©νμ¬ μ»€μ€ν μμΈλ₯Ό λ°μμν€κ³ μμ΅λλ€. catch λΈλ‘μμλ instanceof μ°μ°μλ₯Ό μ¬μ©νμ¬ νΉμ μμΈ ν΄λμ€μ μΈμ€ν΄μ€μΈμ§ νμΈνκ³ , νμμ λ°λΌ μΆκ°μ μΈ λ©μλλ₯Ό νΈμΆν μ μμ΅λλ€.
μμ½
- throw ν€μλλ₯Ό μ¬μ©νμ¬ κ°λ¨νκ² μμΈλ₯Ό λ°μμν¬ μ μμ΅λλ€. μ΄ κ²½μ° λ³λμ μ€λ₯ ν΄λμ€ μ μ μμ΄λ μμΈ μ²λ¦¬κ° κ°λ₯ν©λλ€.
- Error κ°μ²΄λ₯Ό μμλ°μ μλ‘μ΄ μ€λ₯ ν΄λμ€λ₯Ό μ μνλ©΄, μμΈμ λν μΈλΆμ μΈ μ μ΄κ° κ°λ₯νκ³ , μμΈ κ°μ²΄μ λ©μλλ μμ±μ μΆκ°ν μ μμ΅λλ€.
μΈμ λ μν©μ λ§κ² μ μ ν λ°©λ²μ μ ννμ¬ μμΈ μ²λ¦¬λ₯Ό ꡬννλ κ²μ΄ μ€μν©λλ€.
05. finally λΈλ‘ μ¬μ©π
finally λΈλ‘μ tryμ catch λΈλ‘ νμ νμ μ€νλλ μ½λ λΈλ‘μ λλ€. try λΈλ‘ λ΄μμ μ€λ₯κ° λ°μνλ λ°μνμ§ μλ , finally λΈλ‘μ νμ μ€νλ©λλ€. μ΄λ μ£Όλ‘ μμ ν΄μ (μ: νμΌ λ«κΈ°, λ€νΈμν¬ μ°κ²° μ’ λ£)μ κ°μ μ 리 μμ μ μννλ λ° μ μ©ν©λλ€.
μλ μμ λ νμΌμ μ΄κ³ μ½λ μμ μ μννλ©΄μ λ°μν μ μλ μ€λ₯λ₯Ό μ²λ¦¬νκ³ , νμΌμ μμ νκ² λ«λ κ²μ 보μ₯νλ μ½λμ λλ€.
// CustomError ν΄λμ€λ₯Ό μ μνμ¬ Error ν΄λμ€λ₯Ό μμλ°μ
class CustomError extends Error {
constructor(message) {
super(message); // λΆλͺ¨ ν΄λμ€μΈ Errorμ μμ±μλ₯Ό νΈμΆνμ¬ λ©μμ§λ₯Ό μ€μ
this.name = this.constructor.name; // μ€λ₯ μ΄λ¦μ νμ¬ ν΄λμ€ μ΄λ¦μΌλ‘ μ€μ
}
}
// riskyOperation ν¨μλ CustomErrorλ₯Ό λ°μμν΄
function riskyOperation() {
throw new CustomError("Something went wrong during riskyOperation");
}
// μμΈ μ²λ¦¬λ₯Ό ν¬ν¨ν ν¨μ
function executeWithFinally() {
try {
console.log("Trying risky operation..."); // try λΈλ‘ μμ
riskyOperation(); // μ΄ ν¨μκ° μ€λ₯λ₯Ό λ°μμν΄
} catch (error) {
console.error("Caught an error:", error.message); // μ€λ₯κ° λ°μνλ©΄ catch λΈλ‘μ΄ μ€νλ¨
} finally {
console.log("This will always run, no matter what."); // finally λΈλ‘μ νμ μ€νλ¨
// μλ₯Ό λ€μ΄, μ¬κΈ°μμ νμΌμ΄λ λ€νΈμν¬ μ°κ²°μ λ«λ μμ
μ μνν μ μμ
}
}
// executeWithFinally ν¨μ νΈμΆ
executeWithFinally();
06. μ€μ νπ‘
μλ°μ€ν¬λ¦½νΈμμ μμΈ μ²λ¦¬λ₯Ό μ€μ μμ ν¨κ³Όμ μΌλ‘ λ€λ£¨κΈ° μν λͺ κ°μ§ νμ μ 곡ν μ μμ΅λλ€.
- ꡬ체μ μΈ μμΈ μ²λ¦¬: μμΈ μ²λ¦¬λ κ°λ₯ν ν ꡬ체μ μ΄μ΄μΌ ν©λλ€. μ¦, μ΄λ€ μ’ λ₯μ μ€λ₯κ° λ°μν μ μλμ§ λ―Έλ¦¬ μμνκ³ , κ°κ°μ μμΈμ λν΄ μ μ ν μ²λ¦¬ λ°©λ²μ ꡬννλ κ²μ΄ μ’μ΅λλ€. μλ₯Ό λ€μ΄, λ°μ΄ν°λ² μ΄μ€ μ°κ²° μ€λ₯μ νμΌ μ½κΈ° μ€λ₯λ λ€λ₯΄κ² μ²λ¦¬λμ΄μΌ ν©λλ€.
- μλ¬ λ©μμ§ ν¬ν¨: μμΈλ₯Ό μ‘μμ μ²λ¦¬ν λ λ°λμ μ€λ₯ λ©μμ§λ₯Ό ν¬ν¨νμ¬ λ‘κΉ νκ±°λ μ¬μ©μμκ² μ λ¬νλ κ²μ΄ μ€μν©λλ€. μ΄λ λλ²κΉ κ³Ό λ¬Έμ ν΄κ²°μ λκΈ° λλ¬Έμ λ§€μ° μ μ©ν©λλ€.
- finally λΈλ‘ νμ©: finally λΈλ‘μ μ 리 μμ μ μν΄ λ§€μ° μ μ©ν©λλ€. μλ₯Ό λ€μ΄, νμΌμ΄λ λ°μ΄ν°λ² μ΄μ€ μ°κ²°μ λ«κ±°λ 리μμ€λ₯Ό ν΄μ νλ μ½λλ₯Ό finally λΈλ‘μ μμΉμν€λ©΄, μμΈκ° λ°μνλλΌλ 리μμ€ λμλ₯Ό λ°©μ§ν μ μμ΅λλ€.
- throwλ¬ΈμΌλ‘ μμΈ λ°μ: νμν κ²½μ° throw λ¬Έμ μ¬μ©νμ¬ λͺ μμ μΌλ‘ μμΈλ₯Ό λ°μμν€λ κ²μ΄ μ€μν©λλ€. μλ₯Ό λ€μ΄, μ¬μ©μ μ λ ₯μ΄ μ ν¨νμ§ μμ κ²½μ° λ±μμ μ¬μ©ν μ μμ΅λλ€.
- μ½λ 리뷰μ ν μ€νΈ: μμΈ μ²λ¦¬ μ½λλ μ½λ 리뷰 κ³Όμ μμ λ°λμ νμΈλμ΄μΌ ν©λλ€. λν, ν μ€νΈ μλ리μ€λ₯Ό ν΅ν΄ μμΈ μν©μ΄ μ¬λ°λ₯΄κ² μ²λ¦¬λλμ§ νμΈνλ κ²μ΄ μ€μν©λλ€.
- μ μ μμΈ μ²λ¦¬κΈ° μ€μ : μ΄ν리μΌμ΄μ μ μμ μμΈ μ²λ¦¬κΈ°λ₯Ό μ€μ νμ¬ μκΈ°μΉ μμ μμΈκ° λ°μν κ²½μ° κΈ°λ³Έμ μΈ μ€λ₯ μ²λ¦¬λ₯Ό μνν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μ ν리μΌμ΄μ μ΄ λΉμ μ μ’ λ£λλ μν©μ λ°©μ§ν μ μμ΅λλ€.
- μλ¬ μ²λ¦¬μ μ¬μ©μ κ²½ν: μ¬μ©μμκ² κ³΅κ°μ μΈ νκ²½μμλ μ¬μ©μκ° μ΄ν΄ν μ μλ λ°©μμΌλ‘ μ€λ₯ λ©μμ§λ₯Ό νμνλ κ²μ΄ μ€μν©λλ€. μ¬μ©μκ° μ€λ₯ λ©μμ§λ₯Ό λ³΄κ³ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλλ‘ λμμΌ ν©λλ€.
- λΉλκΈ° μ½λμ μμΈ μ²λ¦¬: λΉλκΈ° μ½λμμλ try... catch κ΅¬λ¬Έμ΄ μ§μ μ μΌλ‘ μμΈλ₯Ό μ‘μ§ λͺ»ν μ μμ΅λλ€. λ°λΌμ Promiseμ catch λ©μλλ₯Ό μ¬μ©νκ±°λ async/await ꡬ문μ ν΅ν΄ λΉλκΈ° μ½λμμ λ°μνλ μμΈλ₯Ό μ²λ¦¬νλ λ°©λ²μ μμ§νλ κ²μ΄ μ€μν©λλ€.
07. ν΅μ¬ λ΄μ©π