컴퓨터활용/티맥스

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;