오류에서 복구하기
오류에서 복구하기 (Recovering From Errors)
코드가 오류를 만났을 때 무조건 죽기만 하면 곤란할 때가 있어요. 열어 둔 파일이나 바꿔 둔 상태를 정리하고 넘어가야 할 때가 있죠. Octave는 오류에서 복구하는 방법을 여러 가지 제공해요. try/catch 블록, unwind_protect/unwind_protect_cleanup 블록이 대표적이고, 마지막으로 onCleanup 명령이 있어요. 이 절에서는 그중 onCleanup의 동작을 살펴볼게요.
본문
onCleanup 명령은 평범한 Octave 변수 하나(트리거)를 임의의 함수 하나(동작)와 연결해요. 그 Octave 변수가 사라지는 순간—함수 반환 때문이든, 오류 때문이든, 아니면 단순히 clear로 지웠기 때문이든—연결된 함수가 실행되는 거죠.
그 함수는 파일 핸들 닫기, 오류 메시지 출력, 전역 변수를 초기값으로 복원하기 등 정리에 필요한 일을 뭐든 할 수 있어요. 특히 마지막 예인 전역 변수 복원은 Octave 코드에서 아주 편리한 관용구예요. 예를 들어:
function rand42
old_state = rand ("state");
restore_state = onCleanup (@() rand ("state", old_state));
rand ("state", 42);
...
endfunction # rand generator state restored by onCleanup
이 함수는 난수 발생기의 상태를 바꿨다가, 함수가 끝나면 onCleanup이 원래 상태로 되돌려줘요.
onCleanup
obj = onCleanup ( function )
소멸될 때 주어진 함수를 실행하는 특수 객체를 만듭니다. 객체가 여러 변수(또는 셀·구조체 배열 원소)에 복사되거나 함수에서 반환되면, 그 객체의 마지막 복사본이 지워진 뒤에만 function이 실행됩니다.
입력 function은 함수 핸들이에요. @() 익명 함수를 가리키면 onCleanup 호출 안에 명령을 직접 넣을 수 있죠.
Programming Note: 로컬 onCleanup 변수를 여러 개 만들면 호출 순서는 정해져 있지 않아요. 비슷한 기능이 필요하면 The unwind_protect Statement를 참고하세요.
예시:
octave:1> trigger = onCleanup (@() disp ('onCleanup was executed'));
octave:2> clear trigger
onCleanup was executed
octave:3>
trigger를 지우는 순간 연결된 함수가 실행돼서 메시지가 출력되는 걸 볼 수 있어요.
더 알아보기
- octave-the-try-statement — try/catch로 오류 처리하기
- octave-the-unwind-protect-statement — unwind_protect로 정리 보장하기