예외(exception)란 프로그램이 실행 중에 발생하는 런타임 오류를 의미한다. 이러한 예외가 발생하지 않도록 미리 방지하는 것도 중요하지만, 발생한 예외를 처리하는 방법 또한 매우 중요하다. 오류(error)란 프로그램 구문의 문법적인 오류를 의미합니다. 예외 처리(exception handling)자바스크립트에서는 프로그램이 실행되는 도중 발생하는 예외를 처리하기 위해 try / catch / finally 문을 사용한다.
- try: 에러가 났을 때 원상복구를 시도할 코드. 에러 발생시 코드의 실행 흐름이 catch 블록으로 옮겨간다. - catch: 에러에 대한 정보를 담고 있는 객체(위 예제의 e)를 사용할 수 있다. e.name - finally: try블록 안에서의 에러 발생 여부와 관계 없이 무조건 실행되어야 하는 코드 return, break, continue등으로 코드의 실행 흐름이 즉시 이동되더라도 무조건 실행된다. finally블록은 catch 블록과도 같이 사용된다.
- throw: 예외를 발생시키다라는 것은 에러나 예외 상황을 알린다는 뜻이고, 예외를 강제로 발생시켜야 할 경우가 생길 때는 throw를 사용한다.
catch 블록과 finally 블록은 선택적인 옵션으로 반드시 사용할 필요는 없습니다. 따라서 사용할 수 있는 모든 적합한 try 구문은 다음과 같습니다. 1. try / catch 2. try / finally : try..finally 안에선 에러를 처리하고 싶지 않지만, 시작한 프로세스가 마무리되었는지 확실히 하고 싶은 경우에 사용합니다. 3. try / catch / finally
🔥 예외 자세하게자바와는 달리 자바스크립트는 변수가 죄다 Object로 통일이다. 따로 자료형을 명시하지 않으므로 항상 e instanceof userException을 통해 객체 비교를 해서 따져 야 한다.
🔥 finally 반드시 써야되?Q. 현재 상황은 에러의 유무와 상관없이, 작업 후 초기화를 해야합니다. finally를 사용하면 이점이 있을까요? 아니면 두 코드 조각은 동일하게 동작할까요?
A. 우선 두 코드는 다르게 동작된다. try문안에 작업이 에러가 뜨면 catch에서 핸들링을 하고 스크립트가 종료되게 된다. 하지만 finally안에다 명시를 해주면 스크립트 종료되기전에 반드시 삭제가 실행되게 된다. 예외 처리와 Call Stack자바스크립트 인터프리터는 함수의 호출 과정을 모두 추적하고 있다.
함수 a에서 함수 b를 호출하고 함수 b에서는 함수 c를 호출한다면, 함수 c가 실행을 마칠 때 실행 흐름은 함수 b로 돌아가고 b가 실행을 마칠 때 실행 흐름은 함수 a로 돌아간다. 그렇기 때문에 c가 실행 중일 때는 a와 b는 완료될 수 없고 이렇게 완료되지 않은 함수가 쌓이는 것을 Call Stack 이라 부른다. 에러는 콜 스택 어디에서든 캐치할 수 있다. 어딘가에서 일어나는 에러를 캐치하지 않으면 자바스크립트 인터프리터는 프로그램을 멈추게 되고 처리하지 않은 예외 때문에 프로그램이 충돌하는 원인이 된다. 에러를 캐치하면 콜 스택에서 문제 해결에 유용한 정보를 얻을 수 있다. 만약 함수 c에서 에러가 일어났다면, 콜 스택은 c에서 일어난 에러를 보고하는 데 그치지 않고 b가 c를 호출했으며, b는 a에서 호출했다는 것도 함께 알려주기 때문에 디버그에 유용하게 사용된다.
스택을 추적한 결과를 보여주고 가장 깊은 함수에서 시작하고 함수가 남지 않았을 때 끝난다. 예외 발생 throw예외를 발생시킨다는 것은 명시적으로 오류를 발생시킨다는 의미뿐만 아니라 예외 상황을 알린다는 의미도 있다. 코드를 다른 사람이나 미래의 내가 의도한 대로 사용하지 않을 경우 에러가 발생하도록 할 수 있다. - Error생성자, throw구문 throw new Error();
자체 Error클래스복잡한 프로그램을 짜다보면 추가적인 자세한 정보를 추가해서 에러를 만들고 싶게 된다. 에러의 종류를 구분해야 하거나 에러 객체에 기능을 추가해야 할 필요가 있다. 그냥 내장 에러 생성자가 아니라 자체 Error 클래스를 만들경우 다음과 같은 방법이 있다.
한번 throw된 에러를 캐치하면 다른곳의 try의 catch문은 실행 되지 않는다. 한번 throw된걸 이미 캐치했으니까. 근데, catch나 finally에서 다시 재 throw한다면 바깥 try{}문에서 또 잡힐 것이다.
비동기식 코드에서의 예외 처리 setTimeouttry..catch는 기본적으로 동기적으로 동작한다. setTimeout처럼 ‘스케줄 된(scheduled)’ 코드에서 발생한 예외는 try..catch에서 잡아낼 수 없다.
setTimeout에 넘겨진 익명 함수는 엔진이 try..catch를 떠난 다음에서야 실행되기 때문이다. 스케줄 된 함수 내부의 예외를 잡으려면, try..catch를 반드시 함수 내부에 구현해야 한다.
PromisePromise 객체는 세 가지 상태를 가질 수 있다. pending - Promise 객체에 결과값이 채워지지 않은 상태 then메소드에 첫 번째 인수로 넘겨준 콜백이 실행되지 않고, 두 번째 인수로 넘겨준 콜백이 실행된다. 그리고 이 콜백에는 에러 객체가 첫번째 인수로 주어진다.
Promise가 rejected 상태가 되었을 때 catch 메소드를 통해 다음과 같은 방법으로도 에러 처리 콜백을 지정해 줄 수 있다. 비동기 함수 async비동기 코드에서의 try...catch와 비동기 함수에서의 try...catch는 다르게 동작한다. (내부 동작 방식이 완전히 다르다. - 비동기 함수를 사용하면 예외처리도 보다 편하게 할 수 있다.) 비동기 함수 내부에서는, rejected 상태가 된 Promise객체를 동기식 예외처리 방식과 동일하게 try...catch...finally 구문으로 처리할 수 있다.
Reference https://tcpschool.com/javascript/js_exception_exception https://chiabi.github.io/2018/06/11/try-catch/ https://velog.io/@smooth97/-Learning-Javascript-%EC%98%88%EC%99%B8%EC%99%80-%EC%97%90%EB%9F%AC-%EC%B2%98%EB%A6%AC https://gangzzang.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8JavaScript-%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%ACException-handling https://ktko.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC https://ko.javascript.info/try-catch |