JavaScript - 'try...catch'로 예외 처리 방법

자바스크립트에서 예외가 발생했을 때 try-catch로 예외를 처리하는 방법을 소개합니다. 또한 어떤 조건에서 예외를 발생시키는 방법을 알아보겠습니다.

1. 예외 발생으로 프로그램이 종료되는 코드

존재하지 않는 함수 nonExistentFunction()를 호출하는 프로그램을 실행하면 아래와 같이 에러를 발생시키면서 프로그램이 종료됩니다. 예외가 발생했을 때, 프로그램이 종료되면 문제가 발견되어 버그를 수정할 수 있습니다. 하지만 프로그램이 종료되면 안되는 중요한 프로그램이라면, 예외를 처리(Error handling)하여 프로그램이 종료되지 않도록 만들고 다음 동작이 수행되도록 만들어야합니다.

nonExistentFunction();

console.log("Do other things")

Output:

Error:
/home/js/js_project/examples/node_87afd4b88f3c0.tmp:10
nonExistentFunction();
^

ReferenceError: nonExistentFunction is not defined
    at Object.<anonymous> (/home/js/js_project/examples/node_87afd4b88f3c0.tmp:10:1)
    at Module._compile (internal/modules/cjs/loader.js:1085:14)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)

2. try-catch로 예외 처리(Error/Exception handling)

다음과 같이 try-catch 구문을 사용하면 에러가 발생되었을 때 catch에서 에러를 처리할 수 있으며 프로그램을 종료시키지 않을 수 있습니다. 아래 예제는 catch에서 에러 내용을 출력하고 다음 동작을 수행합니다. 결과를 보시면 Do other things라는 로그가 출력된 것을 확인할 수 있습니다.

try {
  nonExistentFunction();
} catch (error) {
  console.error(error);
}

console.log("Do other things")

Output:

Error:
ReferenceError: nonExistentFunction is not defined
    at Object.<anonymous> (/home/js/js_project/examples/node_6dee02da41b96.tmp:2:3)
    at Module._compile (internal/modules/cjs/loader.js:1085:14)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)

Do other things

3. 직접 에러를 발생시키는 방법

다음과 같이 throw new Error()로 에러를 발생시킬 수 있습니다.

let num = -1;

if (num < 0) {
  throw new Error("num < 0");
}

프로그램을 실행하면 다음과 같이 에러가 발생하면서 종료됩니다.

Error:
/home/js/js_project/examples/node_51b926f893182.tmp:4
  throw new Error("num < 0");
  ^

Error: num < 0
    at Object.<anonymous> (/home/js/js_project/examples/node_51b926f893182.tmp:4:9)
    at Module._compile (internal/modules/cjs/loader.js:1085:14)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
    at Module.load (internal/modules/cjs/loader.js:950:32)

위의 코드는 아래와 같이 try-catch를 사용하여 num이 음수일 때 num에 10을 할당하도록 예외처리할 수 있습니다. 이 경우, 에러 내용은 출력할 필요가 없기 때문에 출력하지 않았습니다.

let num = -1;

try {
  if (num < 0) {
    throw new Error("num < 0");
  }
} catch (error) {
  num = 10;
}

console.log('num: ' + num);

Output:

num: 10

4. try-catch-finally로 예외 처리

try-catch-finally에서 finally는 try 구문을 빠져나올 때 마지막으로 수행되어야하는 작업을 처리합니다. 에러가 발생하거나 안하거나 finally의 코드는 모두 수행됩니다.

아래 예제를 보시면, num이 양수이기 때문에 에러가 발생하지 않습니다. 하지만 finally 안의 코드는 try 구문이 종료될 때 항상 수행됩니다.

function validateNum(num) {
  if (num < 0) {
    throw new Error("num < 0");
  }
}

let num = 10;

try {
  validateNum(num);
} catch (error) {
  console.log("Error occurred");
} finally {
  console.log("num: " + num);
}

Output:

num: 10

아래 예제와 같이, 만약 에러가 발생되는 경우 catch의 코드가 수행되고, 그리고 마지막으로 finally의 코드가 수행됩니다.

function validateNum(num) {
  if (num < 0) {
    throw new Error("num < 0");
  }
}

let num = -1;
try {
  validateNum(num);
} catch (error) {
  console.log("Error occurred");
} finally {
  console.log("num: " + num);
}

Output:

Error occurred
num: -1

5. try-finally

예외 처리가 필요없는 경우 catch가 빠진 try...finally 구문을 사용할 수 있습니다. 물론 에러가 발생하면 프로그램이 종료됩니다.

let num = 10;

try {
  num = 20;
} finally {
  console.log("num: " + num);
}

Output:

num: 20

References

Loading script...

Related Posts

codechachaCopyright ©2019 codechacha