본문 바로가기
Data Science/R 전처리

R에서 오류 예외처리 (try, trycatch) :: Data 쿡북

by 쿡북 2017. 8. 23.

| 서론 

R을 수행하다보면 프로그래밍에 숨겨진 버그나 Data 상의 오류로 언제든 장애가 날 수 있다.

분석 환경이라면 고쳐서 수행하면 되겠지만, R을 기반으로 프로그래밍을 했다면 이는 큰 문제다.

R을 수행하던 중에 중간에서 오류가 날 경우 이후 문장은 전혀 수행되지 않기 때문에 중요한 장애가 아니라면 때로는 이를 무시하고 넘어가야 할 때가 있다.


엔지니어링 하시는 분들에게는 너무도 당연한 기능이 try, catch, finally 기능이다. 

그리고 R에도 당연히 있다. 


| try 이해

try는 선언된 내부 코드중 Error가 있을 경우 이를 그냥 skip 하는 기능이 있다. 


아래 상황은 print 후에 non이라는 선언되지 않은 객체를 불러오면서 Error가 발생하는 상황이다.

> try({

+   print("Data 쿡북")

+   non

+ }, silent=TRUE)

[1] "Data 쿡북"

> try({

+   print("Data 쿡북")

+   non

+ }, silent=FALSE)

[1] "Data 쿡북"

Error in try({ : object 'non' not found


silent는 에러 메시지를 보여줄 것인지를 결정한다.

silent가 TRUE라고 해서 못 보는 것은 아니다.

에러 메시지는 버퍼에 기록이 되는데 geterrmessage() 함수로 읽어올 수 있다.

> geterrmessage()

[1] "Error in try({ : object 'non' not found\n"



여기서 위 코드 중 print와 non위치를 바꿔보자

> try({

+   non

+   print("Data 쿡북")

+ }, silent=FALSE)

Error in try({ : object 'non' not found

바꾼 상태를 보면 non으로 Error가 발생해서 이후의 "Data 쿡북"을 출력하지 않았다. 

즉 Error 이후를 수행하지 않는다.

물론 try 함수 내부의 Error만을 얘기한 것이다.



| tryCatch 이해

Error가 발생했더라도 후속 조치를 하고 넘어갈 수 있으면 더 좋을 것이다.

이를 수행해주는 것이 trycatch 함수다. 

아래 코드를 보자

> e <- simpleError("test error")    ## error메시지를 e 객체에 지정

> tryCatch(

+   stop(e)   ##error 강제 발생

+   ,error = function(e) print("error!!")  ## error 발생시 수행 function

+   ,warning = function(w) print("warning!!")  ## warning 발생시 수행 fucntion

+   ,finally = print("무조건 실행")  ## error이건 정상이건 무조건 수행 

+   )

[1] "error!!"

[1] "무조건 실행"

 

위와 같이 error 발생시에 후속 작업을 하고 종료하게 할 수 있다.

특히 finally는 Error가 발생했더라도 또는 정상 종료더라도 반드시 수행해야 하는 코드를 넣어 주는 것이 좋다.

예를 들어 dbConnection 후에 종료를 해야 하는 경우나

불필요한 객체들로 메모리를 먹는 경우 rm으로 제거해야 하는 경우 등이 그것이다.


| 결론

try ~ catch는 프로그래밍에서는 기본중의 기본이다.

사실 탐색적 데이터 분석에는 필요 없는 것이다보니 많은 분석가 분들은 이 기능을 잘 쓰지 않는 것 같다.

만약 본인의 코드가 시스템에 적용되는 것이라면 반드시 여러가지 장애 상황을 대비해야 하기 때문에 try catch는 반드시 알아야 할 내용이다.



공감 버튼이 큰  힘이 됩니다.





댓글