예외처리를 구현함에 있어서 지난 번(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;
'컴퓨터활용 > 티맥스' 카테고리의 다른 글
DBIO 에서 VIEW 출력변수 생성 팁 (1) | 2008.05.23 |
---|---|
HP 장비의 make 시간이 IBM 장비 보다 오래 걸리는 현상 (0) | 2008.05.22 |
리소스 의존성 검색 SQL (0) | 2008.05.20 |
"[DBIO] 조건에 맞는 함수를 호출할 수 없습니다" 오류시 (0) | 2008.05.19 |
Full GC 발생시 아래사항을 숙지하여 Heap dump를 떠야할 (0) | 2008.05.19 |