API: 디버깅

프로그램을 작성할 때마다(가장 간단한 것부터 가장 복잡한 것까지) 필연적으로 프로그램이 오작동하게 만드는 버그를 마주치게 됩니다. Roll20 API의 샌드박스 특성상 정확히 무슨 일이 벌어지고 있는지 파악하기가 다소 어려울 수 있습니다. 스크립트 문제 진단에 도움이 될 수 있는 몇 가지 팁을 소개합니다.


스크립트가 실행되는 환경에 직접 접근할 수 없으므로, 프로그램의 상태를 파악하기 위해 다량의로그호출에 의존해야 합니다. 예를 들어, 토큰이 제대로 작동하지 않는 이유를 모르겠고, 처리 중인 값들에 대한 통찰력을 얻고 싶다면 다음과 같이 할 수 있습니다:

on("change:graphic:left", function(obj) {
   //이 함수에 들어오는 객체의 left 값은 무엇인가요?
   log(obj.get("left"));
   obj.set("left", obj.get("left") + 70);
   //지금 값은?
   log(obj.get("left"));
   //전체 객체를 디버그하여 현재 속성 목록을 확인할 수도 있습니다
   log(obj);
});

로그 명령어의 출력은 캠페인 스크립트 편집기 페이지에 있는 모드(API) 콘솔에서 확인할 수 있습니다.


오류 잠금

Roll20 API는 필요에 따라 스크립트를 재시작함으로써 스크립트의 사소한 오류로부터 자동으로 복구합니다. 그러나 API가 복구 불가능한 중대한 오류를 감지할 경우, 스크립트를 반복적으로 재시작하여 계속해서 오류가 발생하는 상황을 방지하기 위해 캠페인에 "오류 잠금"을 설정합니다. 이로 인해 오류가 해결될 때까지 모드(API) 스크립트가 실행되지 않습니다. 스크립트에 오류 잠금이 설정된 경우, 스크립트 편집기 페이지에 다음과 같은 메시지가 표시됩니다:

오류 잠금.png

걱정하지 마세요! 스크립트를 수정하여 문제를 해결해 보세요. 그런 다음 "스크립트 저장" 버튼을 클릭하세요. 그렇게 하면 오류 잠금이 "해제"되고 API가 스크립트를 다시 실행하려고 시도합니다. 다른 오류가 발생하면 오류 잠금이 다시 적용됩니다. 오류가 해결될 때까지 이 과정을 필요한 만큼 반복할 수 있습니다. API는 실패 횟수가 너무 많다는 이유로 오류 잠금을 해제하지 못하게 하지 않습니다.


흔히 발생하는 오류

다음은 좀 더 흔히 발생하는 오류들입니다:


myvar가 정의되지 않았습니다

on("ready", function() {
    var myVar;
    log(myvar);
});

오류 메시지에는 "정의되지 않음"이라고 표시되지만, 실제로는 변수가선언되지 않은 상태입니다. 이 문제의 가장 흔한 원인 중 하나는 변수 이름의 오타, 예를 들어 대문자를 빠뜨리는 경우입니다.


속성 'myProperty'를 읽을 수 없습니다 또는 메서드 'myMethod'를 호출할 수 없습니다

on("ready", function() {
    var myVar;
    log(myVar.myProperty);
    log(myVar.myMethod());
});

myVar가정의되지 않았으므로, 스크립트는myVar의 속성에 접근하려는 시도를 처리할 방법을 알 수 없습니다. 이는 다음 중 하나 때문일 가능성이 높습니다:

  • 객체를 찾으려고 했지만 결과가 정의되지 않았습니다. 속성에 접근하기 전에 변수가 정의되었는지 확인하기 위한 오류 검사를 수행하십시오.
  • 변수가 조건부로 정의되고 있습니다(if문이나 유사한 구조를 통해). 그러나 조건 중 어느 것도 일치하지 않아 변수는 선언된 상태로 남아 있지만, 실제로는 정의되지 않았습니다. 모든 가능성에 대한 조건을 설정하거나, 기본값을 지정하거나, 속성에 접근하기 전에 변수가 정의되었는지 확인하기 위한 오류 검사를 수행하십시오.

예상치 못한 토큰

캐릭터가 하나 부족하거나 하나가 너무 많습니다. 이는 객체의 속성 목록이나 배열의 요소 사이에 쉼표를 빠뜨리거나, 복잡하게 중첩된 메서드 호출의 끝에 닫는 괄호가 하나 더 많거나 부족할 때 발생할 수 있습니다.


Roll20 객체의 대부분의 속성은get()set()메서드를 통해 접근해야 합니다. get()을 사용할 때, 읽기 전용 속성의 선행 언더스코어는 생략해야 합니다.

도움이 되었습니까?
122명 중 20명이 도움이 되었다고 했습니다.