Section 10. Error

Udemy - JavaScript: The Advanced Concepts

Section 10. Error

Throw Error

new Error() 자체만으로는 무슨 일을 하는건 아니고
throw 해야지 의미있음

throw: 실행 중단해라, 예외를 던지겠다
error뿐 아니라 무엇이든 던질 수 있음

//이런것도 가능!!

try {
  throw 'hi'
} catch (e) { 
  console.log(e); // 'hi'
} 

throw 호출
-> 현재 실행컨텍스트 중단
-> 콜스택을 따라 다음 컨텍스트 중 catch가 있는곳을 찾아서 핸들링
(-> catch가 끝까지 없으면 프로그램 종료 되어야 하는데)
-> runtime이 잡아줌 (onerror() / process.on("uncaughtException"))

Error 속성

name: 'Error'
message: new Error() 할때 파라메터로 들어간 string
stack: 에러가 발생한 지점을 알려주는 string

// 이런것도 가능!!

const myError = new Error('This is message');
myError.name = 'HAHAHA';

console.log(myError);

//HAHAHA: This is message
//    at Object.<anonymous> (/Users/wendy.wh/develop/free/free.js:1:17)

Error를 커스터마이징 해서 사용하고 싶을 때
(많은 정보를 노출하기 싫어서, 혹은 공통으로 사용하고싶어서 등등)

class AuthenticationError extends Error {
  constructor(message) {
    super(message)
    this.name = 'AuthenticationError'
  }
}
throw new AuthenticationError('내가 만든 에러~');

Handle Error

  • try{} catch{} finally{} :
    sync 코드 + async 코드(Async/Await)
    try에 return이 있어도 finally는 실행됨

  • catch() : async 코드(Promise)

Promise
  .resolve('resolved')
  .then(res => {
    const newRes = res + ' 1';
    console.log(newRes);
    Promise.resolve().then(res => { throw Error('new Error!!!') });
    return newRes;
  })
  .then(res => {
    const newRes = res + ' 2';
    console.log(newRes);
    return newRes;
  })
// resolved 1
// resolved 1 2
// UnhandledPromiseRejectionWarning: Error: new Error!!!

위의 경우는 중간 promise에서 에러를 발생시켜도
처음 promise가 흘러가는데는 영향이 없다
중간 promise의 error를 잡으려면 그에 연결된 catch()가 필요함

catch block scope

catchd의 파라미터(여기서는 err)는 catch블럭 안에서만 유효하다

(function () {
  try {
    throw new Error();
  } catch (err) {
    var err = 5;
    var boo = 10;
    console.log(err);	//5
  }
  console.log(err);	//undefined
  console.log(boo);	//10
})();

좋은 웹페이지 즐겨찾기