8. 예외 처리
8. 예외 처리 (Exception Handling)
R에서 문제가 생겼을 때 어떻게 대응할지, 즉 예외를 다루는 방법은 크게 두 갈래로 나뉘어요. 하나는 stop이나 warning 같은 함수를 직접 호출하는 것이고, 다른 하나는 "warn" 같은 옵션으로 문제 처리 방식을 제어하는 거죠. 이번 장에서는 이 두 메커니즘을 하나씩 살펴볼게요.
출처: R 공식 매뉴얼
본문
R의 예외 처리 기능은 두 가지 메커니즘으로 제공됩니다. stop이나 warning 같은 함수를 직접 호출할 수도 있고, "warn" 같은 옵션을 이용해 문제를 처리하는 방식을 제어할 수도 있어요.
8.1 stop
stop을 호출하면 현재 평가 중이던 표현식의 실행이 멈추고, 인자로 전달된 메시지를 출력한 뒤 실행 흐름이 최상위 레벨(top-level)로 돌아갑니다. 즉, 오류를 만나면 그 자리에서 실행을 중단하고 사용자에게 메시지를 보여주며 대화식 프롬프트로 복귀하는 거예요.
8.2 warning
warning 함수는 문자형 문자열 하나를 인자로 받습니다. 그런데 warning을 호출했을 때의 동작은 "warn" 옵션 값에 따라 달라져요.
"warn"이 음수이면 경고가 무시됩니다.0이면 경고가 저장되었다가 최상위 함수가 끝난 뒤에 출력됩니다.1이면 경고가 발생하는 즉시 출력되고요.2이상이면 경고가 아예 오류(error)로 바뀝니다.
"warn"이 0(기본값)인 경우를 좀 더 자세히 볼게요. 이때 last.warning이라는 변수가 생성되어 각 warning 호출과 연결된 메시지가 이 벡터에 순서대로 저장됩니다. 경고가 10개보다 적으면 함수 평가가 끝난 뒤에 모두 출력되고, 10개를 넘어가면 경고가 몇 개 발생했는지 알려주는 메시지만 출력됩니다. 어느 쪽이든 last.warning에는 메시지 벡터가 들어 있고, warnings 함수로 그 내용을 꺼내 출력할 수 있어요.
8.3 on.exit
함수 본문의 어느 지점에서든 on.exit을 호출할 수 있어요. on.exit을 호출하면 그 시점의 본문 값을 저장해 두었다가 함수가 종료될 때 실행해 줍니다. 덕분에 함수가 시스템 파라미터를 바꿔 쓰더라도, 함수가 끝날 때 원래 값으로 되돌리는 일을 보장할 수 있죠. on.exit은 함수가 정상적으로 끝나든 경고의 결과로 끝나든, 종료 시점에 반드시 실행됩니다.
다만 주의할 점이 있어요. 실행된 on.exit 코드 자체를 평가하는 과정에서 오류가 나면, 남은 on.exit 처리를 더 진행하지 않고 곧바로 최상위 레벨로 점프해 버립니다.
on.exit은 함수가 종료될 때 평가할 표현식 하나를 인자로 받아요.
8.4 오류 관련 옵션 (Error options)
R이 오류와 경고를 어떻게 처리할지 제어하는 옵션 변수들이 여럿 있어요. 아래 표에 정리해 두었습니다.
warn— 경고의 출력 방식을 제어합니다.warning.expression— 경고가 발생했을 때 평가할 표현식을 설정합니다. 이 옵션이 설정되면 기본 경고 출력이 억제됩니다.error— 오류가 발생했을 때 평가할 표현식을 설치합니다. 이 표현식이 평가되기 전에 일반적인 오류·경고 메시지 출력이 먼저 이루어집니다.
options("error")로 설치한 표현식은 on.exit 호출이 수행되기 전에 평가됩니다.
한 가지 재밌는 활용법도 있어요. options(error = expression(q("yes")))을 쓰면 오류가 신호되었을 때 R이 종료되도록 만들 수 있습니다. 이 경우 오류가 발생하면 R이 종료되면서 전역 환경(global environment)이 저장되죠.
더 알아보기
stop,warning,on.exit의 실제 동작은help("stop"),help("warning"),help("on.exit")로 직접 확인해 볼 수 있어요.- 오류 조건을 만들고 다루는 저수준 함수는
simpleError,stopifnot,tryCatch,withCallingHandlers등을 참고하면 좋습니다. - R 공식 매뉴얼의 다른 장에서는 객체(2장), 함수(4장), 표현식 평가(3장)에 대한 설명을 계속 이어볼 수 있어요.