eyabc / blog-comment

1 stars 0 forks source link

https://eyabc.github.io/Doc/dev/core-javascript/%EC%97%90%EB%9F%AC%20%ED%95%B8%EB%93%A4%EB%A7%81.html #15

Open utterances-bot opened 3 years ago

utterances-bot commented 3 years ago

에러 핸들링 | 삽질하는 개발자

https://eyabc.github.io/Doc/dev/core-javascript/%EC%97%90%EB%9F%AC%20%ED%95%B8%EB%93%A4%EB%A7%81.html

pul8219 commented 3 years ago

마지막에 부랴부랴 하느라 제 결과물 예외처리쪽 내용이 부실한데 은영님 글이 많이 도움이 되어서 내용을 추가/수정하고 있습니다. 감사합니다.

에러 다시 던지기

부분에서 아래 코드가 user 앞에 let을 붙이는 걸 잊어 발생하는 에러를 설명해주셨는데요 이렇게 let으로 선언한 변수를 변수 선언 키워드를 붙여주지 않고 전역변수(?)로 받아버리면 자바스크립트에선 무조건 에러가 발생하나요?

let json = '{ "age": 30 }'; // 불완전한 데이터

try {
  user = JSON.parse(json); // <-- user 앞에 let을 붙이는 걸 잊었네요.
  // ...
} catch(err) {
  alert("JSON Error: " + err); // JSON Error: ReferenceError: user is not defined
  // (실제론 JSON Error가 아닙니다.)
}

같은 파트에 아래 나와있는 코드 예제에서요, user 앞에 let을 붙이지 않아 발생하는 경우인데 코드의 user 앞에 let이 왜 붙어있는건가요...?!

user 앞에 let 을 붙이지 않아 발생하는 ReferenceError 는 외부에서 처리하도록 catch 블록에서 throw 를 한번 더 해준다.

let json = '{ "age": 30 }'; // 불완전한 데이터
try {

  let user = JSON.parse(json);
  if (!user.name)
    throw new SyntaxError("불완전한 데이터: 이름 없음");
  blabla(); // 예상치 못한 에러
  alert( user.name );

} catch(e) {

  if (e instanceof SyntaxError) {
    alert( "JSON Error: " + e.message );
  } else {
    throw e; // 에러 다시 던지기 (*)
  }
}
jeongshin commented 3 years ago

내용에서 finally 부분은 빠트렸는데 여기 잘 정리 되어 있어 참고하고 갑니다. 글이 잘 정리되어 있어서 가독성이 정말 좋은거 같아요 ! !

eyabc commented 3 years ago

@pul8219

const json = '{ "age": 30 }'; // 불완전한 데이터

try {
  user = JSON.parse(json); // <-- user 앞에 let을 붙이는 걸 잊었네요.
  // ...
} catch(err) {
  alert("JSON Error: " + err); // JSON Error: ReferenceError: user is not defined
  // (실제론 JSON Error가 아닙니다.)
}

으로 정정하였습니다. 브라우저에서 실행할 때에는 'use strict' 를 맨앞에 붙여주셔야 전역변수로 바인딩 되지 않습니다. 전역 변수로 바인딩 될때는 에러가 발생하지 않지만, ES6 부터는 변수앞에 키워드(const, let, var )를 선언해 주지 않으면 전역변수로 바인딩 되지 않고 Reference 에러가 나는 것으로 알고 있습니다


제가 아무생각없이 공부하다보니 실수가 발생했네요 정정감사합니다!