컴퓨터활용/티맥스

PFM_CATCH 절의 return 값은 오류 리턴 보장되어야 합니다

멜번초이 2008. 5. 21. 19:58
반응형

예외처리를 구현함에 있어서 지난 번(3월)에 가이드 할 때 예외처리 IM 을 FUNCTION 타입으로 구현할 경우

프로그램의 return 값이 정상으로 변경될 수 있으므로 주의해야 하는 번거로움이 있으므로 block 타입으로 지정하는 것을 권장했었는데 이것을 충실히 따른 좋은 예이다.

사용자 삽입 이미지

EMB 그림과 더불어 소스도 충분히 검증되어야 한다. 소스를 열어서 보면 코드상에 문제가 있음을 알 수 있다. 아래의 소스대로 동작된다면 PFM_TRYNJ(pfmBatchDBRollback()); 함수를 호출한 뒤에 rc 값이 RC_NRM 으로 리턴될 경우 그 아래 쪽으로 흘러내려 가면서 return rc; 를 만나서 정상 리턴되고 프레임웍에서 commit 처리 된다는 것이다.

    PFM_CATCH:
        {
            /**************************************
             * KIND     : Intermediary Module Block
             * NODE ID  : 16
             * NAME     : 배치에러처리
             * DESCRIPTION :
             *************************************/
            {
                /**************************************
                 * KIND     : Virtual Module
                 * NODE ID  : 17
                 * NAME     : 배치에러정보 세팅
                 * DESCRIPTION :
                 *************************************/

                //DO_NOT_MODIFY_THIS_LINE-------START_OF_CODE:VIRTUAL_MODULE NODEID17-------//
                /* 실패시에 정보 update */
                PFM_BATCH_ERROR_JOB_INFO("1000", "ERRR01", 600, "에러 처리하였습니다."  );
                //DO_NOT_MODIFY_THIS_LINE--------END_OF_CODE:VIRTUAL_MODULE NODEID17--------//

            }
            {
                /* DB Transaction Commit */
                PFM_TRYNJ(pfmBatchDBRollback());
                //DO_NOT_MODIFY_THIS_LINE------START_OF_CODE:ROLLBACK_EXCEPTION NODEID18---//
                // TODO Auto-generated method stub
                //DO_NOT_MODIFY_THIS_LINE--------END_OF_CODE:ROLLBACK_EXCEPTION NODEID18---//
            }
        }

        return rc;
}


이 코드는 PFM_CATCH 절에서 반드시 RC_ERR 값이 리턴될 수 있도록 보장되기 위하여 다음과 같이 코드가 보완되어야 합니다.

    PFM_CATCH:
        {
            /**************************************
             * KIND     : Intermediary Module Block
             * NODE ID  : 16
             * NAME     : 배치에러처리
             * DESCRIPTION :
             *************************************/
            {
                /**************************************
                 * KIND     : Virtual Module
                 * NODE ID  : 17
                 * NAME     : 배치에러정보 세팅
                 * DESCRIPTION :
                 *************************************/

                //DO_NOT_MODIFY_THIS_LINE-------START_OF_CODE:VIRTUAL_MODULE NODEID17-------//
                /* 실패시에 정보 update */
                PFM_BATCH_ERROR_JOB_INFO("1000", "ERRR01", 600, "에러 처리하였습니다."  );
                //DO_NOT_MODIFY_THIS_LINE--------END_OF_CODE:VIRTUAL_MODULE NODEID17--------// 
            }
            {

                /* DB Transaction Commit */
                PFM_TRYNJ(pfmBatchDBRollback());
                //DO_NOT_MODIFY_THIS_LINE-----START_OF_CODE:ROLLBACK_EXCEPTION NODEID18---//
                rc = RC_ERR;               
            
//DO_NOT_MODIFY_THIS_LINE--------END_OF_CODE:VIRTUAL_MODULE NODEID18------/
/   
           }
        }

        return rc;

}


비슷한 케이스로서 PFM_CATCH 절의 예외처리는 아니지만 다음과 같은 코드도 문제가 된다.  이 경우 RollBack() 이 정상처리가 되었을 경우에   아래로 흘러 RC_NRM 이 return 되게 된다.

사용자 삽입 이미지

   if(rc == RC_NRM) {
        /* DB Transaction Commit */
        PFM_TRY(pfmBatchDBCommit());
    }
    else if(rc != RC_NRM) {
        /* DB Transaction Commit */
        PFM_TRY(pfmBatchDBRollback());
    }

    return RC_NRM;


따라서 다음과 같이 예외처리 코드를 넣어 주는 것이 옳은 코딩 이다.
return RC_NRM; 라인에 도달되기 전에 오류로 return 시켜 줘야 한다.

   if(rc == RC_NRM) {
        /* DB Transaction Commit */
        PFM_TRY(pfmBatchDBCommit());
    }
    else if(rc != RC_NRM) {
        /* DB Transaction Commit */
        PFM_TRYNJ(pfmBatchDBRollback());
        return RC_ERR;  
    }

    return RC_NRM;

반응형