How Exceptions Work

이동창·2021년 6월 25일
0

How to JavaScript

목록 보기
5/5

throw

throw 키워드는 에러를 던질 때 사용한다.
주로 Error constructor로 만든 객체를 사용하지만,
문자열이나 숫자를 포함해 무엇이든 throw가 가능하다.

try.. catch

try 키워드는 코드 블럭에 예외 핸들링을 붙여준다.
그 예외 핸들링은 catch절에 선언하면 됨
catch는 하나의 인자를 허용하는데, 이는 throw로 던진 객체임 (보통은 에러)

 try {
       here_goes_nothing();
 } catch {
       console.log("fail: here_goes_nothing");
}

만약 try 문 안에서 예외가 하나라도 나온다면, catch 절이 실행되게 된다.

Unwinding

예외 처리에서 중요한 것은,
최대한 예외 처리 구문이 성능에 크게 영향을 주지 않게끔 하는 것이다.

따라서 자바스크립트 컴파일러는 catchmap 이라는 것을 함수마다 만든다.
일반적인 함수에서는 이를 쓰지 않다가, throw 구문이 등장하면
만들어 놓은 현재 함수의 catchmap을 불러와 처리한다.

만약 그 catchmap에 catch가 없다면, 호출 함수의 catchmap을 불러오고
없다면 그 함수의 호출 함수를 불러오는 식으로, catch가 나올 때까지 탐색
만약 끝까지 없다면, uncaught exception이 됨

Ordinary Exceptions

예외 처리를 잘못 사용하는 경우가, 자주 발생하는 결과를 예외로 처리하는 것이다.
예를 들어, file을 불러오는 함수에 file not found를 예외로 두면 안된다.

즉, 그냥 return으로 처리할 수 있는 것은 return으로 하자

또한, try.. catch는 문제 없으면 Plan A, 문제 있으면 Plan B
와 같이 최대한 깔끔하게 짜는 것이 좋다.

try {
      plan_a();
  } catch {
      plan_b();
}

Security

Throw를 제대로 catch하는 구문이 없다면,
return보다 보안적인 문제를 야기할 수도 있다.

예를 들어, A과 B라는 패키지가 서버에 설치되어있을 때,
A는 네트워크와 연결되어 있고, B에는 보안키가 있다고 해보자.

A가 직접적으로 B에 있는 보안키에 접근하는 것은 위험하므로
중간 다리 역할을 해줄 전달자가 필요하다.
만약 A가 전달자를 호출하면, 전달자가 B로부터 보안키로 해독한 값을 받고,
이를 전달자가 다시 A에게 주는 형태로 하면 안전할 것이다.

근데 B가 만약 return이 아니라 throw형태로 전달한다면?

throw top_secret.private_key;

만약 전달자가 이를 catch하지 못하거나, 다시 A에게 throw한다면
A가 보안키를 받는 일이 발생하고, 이는 보안적인 문제와 연결된다.

0개의 댓글

관련 채용 정보