λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Language/Javascript

[Javascript]μžλ°”μŠ€ν¬λ¦½νŠΈ μ˜ˆμ™Έ 처리: try...catchλ₯Ό μ΄μš©ν•œ 였λ₯˜ 관리 방법

by YJ Dev 2024. 6. 24.
728x90
λ°˜μ‘ν˜•
SMALL

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ˜ˆμ™Έ μ²˜λ¦¬λŠ” μ½”λ“œ μ‹€ν–‰ 쀑 λ°œμƒν•  수 μžˆλŠ” 였λ₯˜λ₯Ό κ΄€λ¦¬ν•˜κ³  ν”„λ‘œκ·Έλž¨μ΄ κ°‘μžκΈ° μ€‘λ‹¨λ˜μ§€ μ•Šλ„λ‘ ν•˜λŠ” μ€‘μš”ν•œ λΆ€λΆ„μž…λ‹ˆλ‹€. μ˜ˆμ™Έ 처리λ₯Ό 톡해 μ‚¬μš©μž κ²½ν—˜μ„ ν–₯μƒν•˜κ³  ν”„λ‘œκ·Έλž¨μ˜ μ•ˆμ •μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€. 이번 ν¬μŠ€νŒ…μ—μ„œλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μ˜ˆμ™Έ 처리의 κΈ°λ³Έ κ°œλ…κ³Ό μ‚¬μš© 방법을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ μ˜ˆμ™Έμ²˜λ¦¬


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() ν•¨μˆ˜κ°€ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•ŠλŠ” 경우:
    1. try 블둝이 μ •μƒμ μœΌλ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€.
    2. result λ³€μˆ˜μ— riskyOperation() ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ΄ μ €μž₯되고, ν•΄λ‹Ή 값이 μ½˜μ†”μ— 좜λ ₯λ©λ‹ˆλ‹€.
    3. finally 블둝이 μ‹€ν–‰λ˜μ–΄ "This will always run, no matter what." λ©”μ‹œμ§€κ°€ 좜λ ₯λ©λ‹ˆλ‹€.
  • riskyOperation() ν•¨μˆ˜κ°€ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€λŠ” 경우:
    1. try 블둝 λ‚΄μ˜ μ½”λ“œ 싀행이 μ€‘λ‹¨λ˜κ³ , catch λΈ”λ‘μœΌλ‘œ μ œμ–΄κ°€ λ„˜μ–΄κ°‘λ‹ˆλ‹€.
    2. catch 블둝이 μ‹€ν–‰λ˜μ–΄ 였λ₯˜ λ©”μ‹œμ§€κ°€ μ½˜μ†”μ— 좜λ ₯λ©λ‹ˆλ‹€.
    3. 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. μ‹€μ „ νŒπŸ’‘

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ˜ˆμ™Έ 처리λ₯Ό μ‹€μ „μ—μ„œ 효과적으둜 닀루기 μœ„ν•œ λͺ‡ 가지 νŒμ„ μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  1. ꡬ체적인 μ˜ˆμ™Έ 처리: μ˜ˆμ™Έ μ²˜λ¦¬λŠ” κ°€λŠ₯ν•œ ν•œ ꡬ체적이어야 ν•©λ‹ˆλ‹€. 즉, μ–΄λ–€ μ’…λ₯˜μ˜ 였λ₯˜κ°€ λ°œμƒν•  수 μžˆλŠ”μ§€ 미리 μ˜ˆμƒν•˜κ³ , 각각의 μ˜ˆμ™Έμ— λŒ€ν•΄ μ μ ˆν•œ 처리 방법을 κ΅¬ν˜„ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° 였λ₯˜μ™€ 파일 읽기 였λ₯˜λŠ” λ‹€λ₯΄κ²Œ μ²˜λ¦¬λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
  2. μ—λŸ¬ λ©”μ‹œμ§€ 포함: μ˜ˆμ™Έλ₯Ό μž‘μ•„μ„œ μ²˜λ¦¬ν•  λ•Œ λ°˜λ“œμ‹œ 였λ₯˜ λ©”μ‹œμ§€λ₯Ό ν¬ν•¨ν•˜μ—¬ λ‘œκΉ…ν•˜κ±°λ‚˜ μ‚¬μš©μžμ—κ²Œ μ „λ‹¬ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. μ΄λŠ” 디버깅과 문제 해결을 돕기 λ•Œλ¬Έμ— 맀우 μœ μš©ν•©λ‹ˆλ‹€.
  3. finally 블둝 ν™œμš©: finally 블둝은 정리 μž‘μ—…μ„ μœ„ν•΄ 맀우 μœ μš©ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, νŒŒμΌμ΄λ‚˜ λ°μ΄ν„°λ² μ΄μŠ€ 연결을 λ‹«κ±°λ‚˜ λ¦¬μ†ŒμŠ€λ₯Ό ν•΄μ œν•˜λŠ” μ½”λ“œλ₯Ό finally 블둝에 μœ„μΉ˜μ‹œν‚€λ©΄, μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ”λΌλ„ λ¦¬μ†ŒμŠ€ λˆ„μˆ˜λ₯Ό 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.
  4. throw문으둜 μ˜ˆμ™Έ λ°œμƒ: ν•„μš”ν•œ 경우 throw 문을 μ‚¬μš©ν•˜μ—¬ λͺ…μ‹œμ μœΌλ‘œ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ‚¬μš©μž μž…λ ₯이 μœ νš¨ν•˜μ§€ μ•Šμ€ 경우 λ“±μ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  5. μ½”λ“œ 리뷰와 ν…ŒμŠ€νŠΈ: μ˜ˆμ™Έ 처리 μ½”λ“œλŠ” μ½”λ“œ 리뷰 κ³Όμ •μ—μ„œ λ°˜λ“œμ‹œ ν™•μΈλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. λ˜ν•œ, ν…ŒμŠ€νŠΈ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό 톡해 μ˜ˆμ™Έ 상황이 μ˜¬λ°”λ₯΄κ²Œ μ²˜λ¦¬λ˜λŠ”μ§€ ν™•μΈν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.
  6. μ „μ—­ μ˜ˆμ™Έ 처리기 μ„€μ •: μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ 전역에 μ˜ˆμ™Έ 처리기λ₯Ό μ„€μ •ν•˜μ—¬ 예기치 μ•Šμ€ μ˜ˆμ™Έκ°€ λ°œμƒν•  경우 기본적인 였λ₯˜ 처리λ₯Ό μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 비정상 μ’…λ£Œλ˜λŠ” 상황을 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.
  7. μ—λŸ¬ μ²˜λ¦¬μ™€ μ‚¬μš©μž κ²½ν—˜: μ‚¬μš©μžμ—κ²Œ 곡개적인 ν™˜κ²½μ—μ„œλŠ” μ‚¬μš©μžκ°€ 이해할 수 μžˆλŠ” λ°©μ‹μœΌλ‘œ 였λ₯˜ λ©”μ‹œμ§€λ₯Ό ν‘œμ‹œν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. μ‚¬μš©μžκ°€ 였λ₯˜ λ©”μ‹œμ§€λ₯Ό 보고 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ„λ‘ 도와야 ν•©λ‹ˆλ‹€.
  8. 비동기 μ½”λ“œμ˜ μ˜ˆμ™Έ 처리: 비동기 μ½”λ“œμ—μ„œλŠ” try... catch ꡬ문이 μ§μ ‘μ μœΌλ‘œ μ˜ˆμ™Έλ₯Ό μž‘μ§€ λͺ»ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ Promise의 catch λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ async/await ꡬ문을 톡해 비동기 μ½”λ“œμ—μ„œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λŠ” 방법을 μˆ™μ§€ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

07. 핡심 λ‚΄μš©πŸ‘€

μžλ°”μŠ€ν¬λ¦½νŠΈ μ˜ˆμ™Έμ²˜λ¦¬

728x90
λ°˜μ‘ν˜•
LIST