try { foo(); } catch (error) { console.error("[에러 발생]", error); // [에러 발생] ReferenceError: foo is not defined }
// 발생한 에러에 적절한 대응을 하면 프로그램이 강제 종료되지 않는다. console.log("[End]");
에러가 발생했을 경우 강제 종료가 되는 것이 아닌 catch문을 실행 후 계속 코드를 실행시킨다.
catch (error) 에서 error에는 에러 객체가 전달된다.
옵션으로 finally 를 사용할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
console.log("[Start]");
try { // 실행할 코드(에러가 발생할 가능성이 있는 코드) foo(); } catch (err) { // try 코드 블록에서 에러가 발생하면 이 코드 블록의 코드가 실행된다. // err에는 try 코드 블록에서 발생한 Error 객체가 전달된다. console.error(err); // ReferenceError: foo is not defined } finally { // 에러 발생과 상관없이 반드시 한 번 실행된다. console.log("finally"); }
// try...catch...finally 문으로 에러를 처리하면 프로그램이 강제 종료되지 않는다. console.log("[End]");
이러한 이유 때문에 비동기 함수는 콜백함수를 이용하여 값을 전달 받았다. 하지만 콜백 함수를 이용하면 콜백헬 또는 에러 처리에 대한 어려움 등이 있다. 이와 같은 이유로 프로미스가 등장했다.
프로미스의 생성
1 2 3 4 5 6 7 8 9
// 프로미스 생성 const promise = newPromise((resolve, reject) => { // Promise 함수의 콜백 함수 내부에서 비동기 처리를 수행한다. if (/* 비동기 처리 성공 */) { resolve('result'); } else { /* 비동기 처리 실패 */ reject('failure reason'); } });
resolve의 인수값으로는 성공했을 시의 처리 reject의 인수값으로는 실패했을 시의 처리값을 인수로 준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
const get = (url) => { const xhr = new XMLHttpRequest();