ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 콜백 규칙 및 예외처리
    @19.1 ~ /Nodejs 2020. 5. 31. 23:40

    Nodejs에서 연속 전달 스타일(CPS)의 API 및 콜백은 일련의 특정한 규칙을 따릅니다

    이 규칙은 Nodejs 코어 API에 적용되지만 대다수의 사용자 영역 모듈과 어플리케이션에도 적용됩니다

     

    1. 콜백은 맨 마지막에

    모든 Nodejs 함수에서 표준 규칙은 함수가 입력에서 콜백을 허용한다면 맨 마지막 인자로 전달되어야 한다는것

    fs.readFile(filename, [options], callback)

    함수 호출의 가독성을 좋게하기 위해서..

     

    2. 오류는 맨 앞에

    CPS에서는 오류가 다른 유형의 결과처럼 전달되므로 콜백 사용이 필요합니다.

    Nodejs.에서 CPS함수에 의해 생성된 오류는 항상 콜백의 첫번쨰 인수로 전달되며

    실제 결과는 두번쨰 인수에서부터 전달됩니다.

    동작이 에러없이 성공하면 최초의 인수는 null 또는 undefine이 됩니다

    fs.readFile('foo.txt', 'utf8', (err, data)=>{
    	if(err)
        	handleError(err);
        else
        	processData(data);
    });

    에러가 있는지 항상 체크하는 것이 좋습니다. 그렇지 않으면 코드를 디버깅하고 에러 지점을 찾는것이 어려울수 있습니다

    오류는 항상 Error 유형(type)이어야 한다는 것입니다. 즉, 간단한 문자열 이나 숫자를 오류 객체로 전달해서는 안됩니다

     

    3. 오류 전파

    동기식 직접 스타일 함수의 오류 전파는 잘 알려진 throw문을 사용하여 수행되므로 오류가 catch 될떄까지 호출 스택에서 실행됩니다

    그러나 비동기식 CPS에서 적절한 오류전달은 오류를 호출체인의 다음에서 콜백으로 전달하여 수행됩니다.

    일반적인 패턴은 아래와 같습니다

    const fs = require('fs');
    function readJSON(filename, callback){
    	fs.readFile(filename, 'utf8', (err, data)=>{
        	let parsed;
            if(err){
            	return callback(err);	//오류를 전달하고 현재 함수를 종료
            }
            
            try{
            	//파일의 내용을 해석
            	parsed = JSON.parse(data);
            }catch(err){
            	//에러 catch
            	return callback(err);
    		}
            
            //에러가 없으면 데이터 전달
            callback(null, parsed);
        });
    }

    알아야하는 것은 유효한 결과를 전달할 떄와 오류를  전달할때의 콜백이 호출되는 방식입니다.

    또한 에러를 전파할 때 return문을 사용한다는것이다. 콜백함수가 호출되는 즉시 함수에서 빠져나와 readJSON내의 그 다음줄을 실행하지 않도록 합니다

    readJSON함수에서 보았듯이 fs.readFile() 함수 내 콜백에서 던져지는 예외를 피하기 위해

    JSON.parse()를 try ... catch블록으로 둘러쌋습니다. 

    그 이유는 비동기 콜백 내부에서 예외를 발생시키면 예외가 이벤트 루프로 이동하여 다음 콜백으로 전파되지 않습니다

    Nodejs에서 이것은 회복 불능 상태입니다

     

    어플리케이션은 그냥 종료되고 stderr인터페이스를 통해 오류를 출력합니다

    예외가 콜백에서 스택으로 이동한 다음 즉시 이벤트 루프로 이동하여 catch되어 throw된다는걸 의미합니다

     

    이것을 호출함수인 readJSON을 try ... catch로 둘러싸서 호출한다고하더라도 소용이 없다는걸 의미합니다

    블록이 동작하는 스택이 콜백이 호출된 스택과 다르기 때문입니다

    try{
    	readJSON('nonJSON.txt', function(err, result){
        });
    }catch(err){
    
    }

    비동기 함수의 실행은 이벤트 루프에 의해 각기 다른 스택에서 실행되기 때문에 트리거 함수가 아닌 이벤트 루프에서 끝나게 됩니다

    '@19.1 ~ > Nodejs' 카테고리의 다른 글

    프록시 패턴  (0) 2020.06.19
    노드 Promise 패턴  (0) 2020.06.11
    모듈 정의패턴  (0) 2020.06.03
    Map, WeakMap  (0) 2020.05.31
Designed by Tistory.