Exception (예외)
- 호출한 함수는 개발자가 예상하지 못한 방식으로 문제를 일으킬 수 있습니다.
프로그램에서 문제가 발생했을 때 다루는 가장 보편적인 방법은 예외 처리입니다.
예상하지 못한 일이 발생하면, 현재 하고 있는 일을 전부 멈추고 예외 핸들러가 프로그램이 무엇을 해야 할지 알려 줄 것입니다.
- 문제가 생기면 throw 문을 통해 신호가 발생됩니다.
throw new Error('critical error');
throw 'critical error';
위 예시처럼 자바스크립트는 throw 에 어떤 값이든 허용합니다. throw 로는 Error 생성자로 만들어진 값을 던지는 것이 일반적이지만 필수는 아닙니다.
try {
...
} catch (e) {
...
}
try 문 내에서 예외가 발생하면 catch 절이 실행되며 여기에는 throw 문이 던진 단 한 개의 인자만 받을 수 있습니다.
함수의 모든 문장은 제각각 try - catch 를 가질 수 있고, try 안에 try 를 쓰거나 catch 안에 try 문, try 와 catch 모두 throw 문을 쓸 수 있습니다. 하지만 쉽고 예측 가능한 실행 흐름을 만들기 위해 하나의 함수에서 try 를 두 번 이상 쓰지 않는 것이 좋습니다.
- 예외 처리가 신경 써야 할 중요한 점은 제대로 동작하는 프로그램엔 성능 패널티가 없어야 한다는 것입니다.
예외가 발생하면 성능이 저하될 수 있지만 그런 상황은 극히 드물며 저하된다 해도 그 폭이 크지 않습니다.
- 자바스크립트의 캐치맵
자바스크립트 컴파일러는 컴파일하는 모든 함수에 대한 캐치맵을 만드는데, 캐치맵은 함수 몸체의 명령어 위치와 이들을 처리하는 catch 문을 연결해 줍니다. throw 문이 실행되면 예외가 발생하고 현재 함수에 대한 캐치맵을 참조합니다.
지정된 catch 절이 있으면 해당 절이 제어권을 얻어 실행되고 없으면 함수를 호출한 곳을 찾습니다.
이러한 과정을 계속 반복해 catch 절을 찾을 때까지 가상의 호출 스택을 타고 내려가 더 이상 호출 스택이 없으면 처리할 수 없는 예외 (uncaught exception) 가 됩니다.
- 예외 처리를 잘못 쓰는 가장 흔한 경우는 정상적인 결과를 처리할 때도 쓰는 것입니다.
예를 들어 파일을 읽는 함수에서 파일을 찾을 수 없는 것은 예외가 아닙니다.
자바의 경우 타입 시스템과 연결되어 try 블록 하나에 여러 catch 절이 붙어있습니다. 이와 달리 자바스크립트의 타입 시스템은 유연해서 예상할 수 있는 모든 상황을 처리하기에 충분하고, 플랜 A 로 시작한 try 문이 실패했을 때 catch 절의 플랜 B 로 가는 심플한 실행 흐름을 만들 수 있습니다.
에러를 복구하는 데 필요한 원인을 추론하기는 어렵고, 테스트하기는 훨씬 더 어렵습니다.
단순한 패턴으로 가서 예상되는 모든 출력 값을 반환 값으로 다루고, 그렇지 않은 것만 예외로 남기도록 합니다.
- 신뢰성
예외 객체의 세부 사항은 중요하며 프로그래머가 알아야 할 유용한 정보입니다.
try {
...
} catach (e) {
console.error(e);
}
간혹 위 예시처럼 에러를 호출 스택으로 전달되게 해 그냥 잊혀지기 일쑤인 경우가 많습니다. 예외 처리 방법 자체를 신뢰할 수 없게 만드는 것이며, 이런 정보는 저널 항목, 로그 등의 형태로 프로그래머에게 전달되도록 해야 합니다.
실제로 사내의 많은 서버 중 예외 발생 시 console 로만 찍고 넘어가게 되어있어 무시되는 케이스가 많고, 가끔씩 문제 생긴 인스턴스의 로그를 보면 상당히 많은 에러가 찍혀 있으나 프로그래머는 전혀 모르는 경우도 있습니다. 이러한 부분들을 사내에선 Sentry 를 활용하거나 모니터링 시스템의 alert manager 를 통해 slack 채널로 발생한 에러 정보를 받도록 하고 있는데, 이것 또한 하나의 방법이 될 수 있습니다.
출처 : 자바스크립트는 왜 그 모양일까?
'Backend > Javascript' 카테고리의 다른 글
[Javascript] - Purity (0) | 2021.01.02 |
---|---|
[Javascript] - this (0) | 2020.12.19 |
[Javascript] - Generator (0) | 2020.12.05 |
[Javascript] - Function (0) | 2020.11.28 |
[Javascript] - Statement (0) | 2020.11.21 |