Front-End Exception Handling
개발을 하다보면 컴파일 과정에서 발생하는 오류는 컴퓨터가 잡아주어 손쉽게 해결 할 수 있지만, 런타임 과정에서 반드시 마주하게 되는 에러를 어떻게 하면 효율적이고 직관적으로 처리해야하나 고민을 많이 하게 되는데 그 중에서 try…catch 문법을 사용하여 에러를 핸들링 하는 방법을 알아 보고자 합니다.
구성
try catch 구문은 언어별로 다양하게 구성되어 있습니다.
javascript
try{ //동작} catch(){//런타임 에러시 동작}
python
try:except:else:
try … catch 동작 알고리즘
try내에 코드가 실행되고, 예외를 throw하면 발생한 위치에서 catch 블록으로 넘어가게 됩니다. 여기서 정상적으로 실행 될 시 try문이 끝까지 실행되고 catch를 건너 뛰게 되는데예외를 발생했을 경우 catch 블록이 실행 되며 개발자가 작성 해둔 예외 처리문이 실행됩니다.
try…catch…finally 문법
Try
try블록은 개발자가 의도치 않은 상황이 발생 할 수 있는 코드를 작성하는 곳 입니다.
try는 하나 혹은 그 이상의 선언을 포함하여 try , catch ,finally 항목 중 최소 두가지 이상을 포함하여 이루어져 있으며, 세 가지 형식이 존재합니다.
try...catch
try...finally
try...catch...finally
또한 try는 중첩해서 사용이 가능하며 동기식으로 동작하며 try내부에서 비동기로 예외가 발생 할 경우 실행 스택을 찾지못해 예외를 잡을 수 없습니다.
try{
setTimeout(() =>{
error()
})}catch(e){}
해당 경우는 catch블록에서 예외를 잡지 못합니다.
Catch
catch는 try내에서 예외가 발생하는 경우 예외 코드나 예외 객체를 인수로 전달받아 무엇(What)을 할지 명시하는 곳 입니다.
catch(e)
e
에러의 이름이며 정의되지 않은 변수 때문에 발생한 에러라면 default로 지정해 놓은 에러로 변경 됩니다. 넘어오는 예외 타입에 따라서 예외를 처리하는 방법을 나눌 수 있습니다.
Finally
예외가 발생 하지 않아도 블록이 실행 된다는 점에서 중요한 블록 입니다 . 그러나 예외가 발생하면 발생한 예외를 처리하는 블록이 없더라도 블록 의 명령문이 실행됩니다 .
finally
블록을 사용하여 예외가 발생할 때 스크립트가 정상적으로 실패하도록 할 수 있습니다 . 예를 들어 스크립트가 묶인 리소스를 해제해야 할 수 있습니다.
Ex.
try{
OpenFile()
}
catch(e){
handleError(e)
}
finally{
closeFile()
}
결론
try … catch 구문은 개발자 입장에서 굉장히 편하다고 생각 됩니다. 하지만 편한 만큼 정확하고 제대로 쓰지 않으면 독이 될수있습니다. JavaScript에서는 거의 모든 객체를 throw 할 수 있습니다. 그럼에도 불구하고 throw된 모든 예외가 동일하게 생성되는 것은 아니기 때문에 예외를 정확히 핸들링 하지 않고 상황을 모면 하는 식으로 처리 할 경우 어느 상황에서 에러가 발생했는지 트래킹을 할 수 없고, 가독성 측면에서도 좋지않아 동료 개발자들에게 피해를 끼칠수 있는 점이 있습니다. 하지만, 해당 코드에서 발생 할 수 있는 예외를 세분화 하여 정리하면 가독성도 올라 갈 뿐 만 아니라 장기적으로 개발 능률이 오를 수 있는 장점이 있다고 생각하고 있습니다.
reference.