MaxScirpt Exception Log 남기기

 

 

Script를 만들다 보면 모든 예외처리를 완벽하게 하긴 힘들죠.

Script도 결국 사람이 만드는 것이니깐요.

그러다보니 이미 배포한 Script에서 다양한 오류가 나게 됩니다.

 

여기에서 스크립트가 점점 늘어날 때마다 관리포인트가 증가하게 되는데요.

피드백을 잘 주는 분들도 있지만 대부분 조용히 있는 경우가 대부분 있습니다.

그러다 보니 정말 치명적인 오류가 나지 않는 이상, 제작자는 모르고 넘어가는 경우가 많습니다.

 

그리고 막상 오류가 났지만 어떤 경우에 오류가 발생했는지 찾는데도 시간을 많이 소모하게 되는데요.

이를 보완하고자 할 때 사용 하는 방법이 Log를 남기는 것입니다.

 

Exception 관련 CallBack이 있으면 좋겠지만... 없는 관계로, Try Catch를 사용합니다.

(Try Catch가 좋은 방법은 아니지만...)

 

1. GetCurrentException

 

오류를 받기위해서 Max에서 가장 손쉽게 접근 할 수 있는 쪽이 Try Catch 입니다.

try()
catch( logString = getCurrentException() )

Try에서 Exception이 났을 때 Catch에서 getCurrentException함수를 호출하면, 어떤 오류가 났는지 알 수 있습니다.

 

 

2. logsystem

 

getCurrentException함수로 받아진 오류를 logsystem을 이용하면 쉽게 Log 파일을 남길 수 있습니다.

 

logsystem.quietMode = false -- quietMode가 true면 error log를 남기지 않음

logsystem.logName "C:\Users\HwangGoon\Desktop\Log\WallDesigner.log" -- log를 남길 파일 설정

-- logName은 전역으로 선언되기에 한번만 등록하면 됩니다.

logsystem.logEntry "오류 메시지" -- 여기에 오류를 적용하면 다음과 같이 파일이 생성 됩니다.

 

 

3. 예제 코드

 

-- logName 선언 --

logsystem.logName "C:\Users\HwangGoon\Desktop\Log\WallDesigner.log"

 

-- WallDesigner.ms -----------------------------------------------

global g_WallDesignerRollout

try (destroyDialog g_WallDesignerRollout) catch()

rollout g_WallDesignerRollout "WallDesigner"
(
 button btn_OpenDesignFile "..."

 on btn_OpenDesignFile pressed do
 (
  print (1 + undefined)
 )
)
createDialog g_WallDesignerRollout width:100 height:100
------------------------------------------------------------------

 

-- WallDesigner.mcr -----------------------------------------------
macroScript WallDesigner
category:"HwangGoon"
buttonText:"Wall Designer"
tooltip:"Wall Designer"
(    
    on execute do
 (
  try
  (
   include "HwangGoon/WallDesigner.ms"
  )
  catch
  (
   logString = getCurrentException()
   logsystem.logEntry logString

   try (destroyDialog g_WallDesignerRollout) catch()
  )
 )
)
------------------------------------------------------------------

 

-- log 내용 -------------------------------------------------------

2013/12/04 11:44:38 DBG: -- Incompatible types: 2, and undefined
2013/12/04 11:44:42 DBG: -- Incompatible types: 1, and undefined
2013/12/04 11:44:45 DBG: -- Incompatible types: 2, and undefined
2013/12/04 11:44:46 DBG: -- Incompatible types: 3, and undefined
2013/12/04 11:44:48 DBG: -- Incompatible types: 4, and undefined
------------------------------------------------------------------

 

mcr파일에서 Try Catch를 건 이유는 ms파일은 직접 작업을 해야합니다.

그러니 오류를 바로 확인할 수 있어야 겠죠.

그래서 mcr파일에서 사용 했습니다.

 

이 방법을 활용하면 log를 조금 더 디테일하게 남길 수도 있겠죠.

A 스크립트의 B함수에서 C라는 오류가 났다던가... 하지만 함수 마다 Try Catch를 거는건 추천하지 않습니다.

이유는...

코드가 난잡해지고, 오류를 수정할 때 힘들어 지게 되니깐요.

 

 

4. Log파일 받아보기

 

Start 폴더에 Script를 넣어두면, 맥스가 오픈되면서 Script가 실행 됩니다.

Start 함수에 SVN 업데이트 코드를 넣어두면 개인Log파일을 SVN을 통해 받아 볼 수 있습니다.

SVN 사용방법은 아래 게시물에 있습니다.

 

혹은 DB와 연동하는 방법도 좋습니다.

Start 함수를 이용해 log파일을 DB에 저장 하는 방법으로 처리하면 통계부터 해서 관리가 한결 편해집니다.

C#으로 DLL을 만들어 DB에 저장하는 함수를 만드는 방법이 좋습니다.

 

이렇게 Log파일을 받아보는 이유는

제작자가 뛰어다니지 않고, 자리에 앉아서 log파일을 보면서 오류를 잡기위해서 입니다.

인원이 적으면 괜찮지만 인원이 늘어나고, 회사가 여러층으로 되어 있는 겨우...

뛰어 다니다가 지치겠죠~

 

 

저는 다음과 같이 작업 했습니다.

 - SVN ID 사용자 이름으로 설정

 - Start 함수로 Script SVN Update

 - Script 사용 Log, 오류 Log DB로 전송 (SVN 사용자 이름으로 데이터 등록)

 - 제자리에서 사용 기록과, 오류 Log 확인

 - 수정 후 SVN으로 배포

 - 작업자 맥스 재실행 시 Script 최신으로 갱신

 

 

<참고>

 

Try Catch에서 바로 Log를 올리는 방법도 있지만, 굳이 Start 함수로 제작하는 것을 권하는 이유는

네트워크 환경에 따라 접근하는데 시간이 소요되거나, 인터넷이 연결되지 않은 경우 업데이트 코드가 돌면서 맥스가 먹통이 되는 경우를 방지하기 위해서 입니다.

 

혹은 스레드를 분리해서 업데이트를 사용하는 것도 방법이 될 수 있습니다.

스레드를 분리하는 방법은 다음에 이야기를 해볼게요.

 

 

Posted by Hwanggoon
,