[node js] request와 try catch에 관한 고찰

2020. 6. 13. 17:04프로젝트/nodejs


try catch란 무엇일까.

 


 

가장 간단하게 말하자면 try 구문 안에 명령을 실행하던 중, 에러가 나면 프로그램이 종료되지 않고 catch 문으로 빠지는 유용한 구문입니다. 대부분의 개발자들이 알고 있는 try - catch. 오늘은 이 callback 함수에서 try catch를 사용 할 때 생기는 문제를 적어보려고 합니다.

 

사실 이미 대다수의 개발자들이 알고 있을지도 모르는 정보. 최근 웹개발에서 pi의 서비스를 구현하다 보니 가장 신경쓰게 되는 점이 바로 죽지 않는 것. 이었습니다. 가장 쉽지만 가장 어려운 요소. ... 차량 통제 시스템을 구현하다 보니 라즈베리 파이 안에서 항상 살아있지 않으면 차량 통제 시스템이 먹통이 되는 사태가 발생하므로 신경을 많이 쓰게 되었습니다. 처음 단독으로 맡게된 pi용 서비스라 에러 처리에 신경을 곤두세웠음에도 불구하고.

 

대망의 테스트날, 인터넷이 먹통이 되는 상황에서 프로그램이 바로 죽어버리는 상황이 발생하고 말았습니다. 분명 try catch를 다 적었는데? 의아한 상황에서 테스트는 종료. 사수님께 가져가 상황을 말씀드려보니 바로 찾아낸 문제점이 바로 request를 보내는 상황에서 try -catch가 잘못 처리된 것이었습니다.

 

일반적으로 request 밖에 try-catch를 한번 묶어두었는데, 서버에 요청을 보내고 callback을 받은 함수 내부에서 try-catch를 처리를 안한 것이었습니다.

 

잘못된 예: 

request("http://test", function(err, res, body) { 
	console.log(body); 
});

 

 

저렇게 되면 인터넷은 붙어있으나 외부망이 막혀있을 경우 제대로 된 응답을 받지 못해 에러가 나서 프로그램이 죽어버리는 상황이 발생됩니다. 실제로 밖에서 작동되는 것들은 인터넷 상황이 어떻게 변할지 몰라 request는 더욱 신경써야 하므로 주의해야 합니다.

 

아래와 같이 처리해주는게 좋습니다. 

request("http://test", function(err, res, body) { 
	try{
         if (err) {
            console.log(err);
            return;
        }
		console.log(body);
     } catch(e) { console.log(e); }
 });

try-catch 뿐만 아니라 err을 체크해주도록 합니다. 거의 경우 res의 응답 코드가 200번이 아니면 처리를 하니 문제가 더 생기더라고요. 에러코드를 들고 오면 바로 에러를 처리해줘도 좋습니다. 혹시 모르니 request 안에서 try-catch를 한번 더 묶어줘도 좋고요. 

 

어떻게 보면 당연한건데 에러처리에서는 아직 덤벙거리는 것 같습니다.

 

 

 

혹시 틀린 정보가 있다면 피드백은 언제나 환영입니다.