API: 디버깅

프로그램을 작성하는 동안 (가장 간단한 것부터 가장 고급스러운 것까지) 불가피하게 프로그램이 제대로 작동하지 않는 버그를 만나게 될 것입니다. Roll20 API의 격리된 특성으로 인해 정확히 무슨 일이 일어나고 있는지를 알아내기가 조금 어려울 수 있습니다. 그래서 여기에는 스크립트의 문제를 진단하는 데 도움이 될 수 있는 몇 가지 팁이 있습니다.


스크립트가 실행되는 환경에 직접 액세스할 수 없으므로 방대한 양의로그호출을 통해 프로그램에서 어떤 일이 일어나고 있는지 알 수 있습니다. 예를 들어, 토큰이 올바르게 이동하지 않는 이유를 확신하지 못하고 주변에서 발생하는 값에 대한 통찰력을 얻고 싶다면 다음과 같이 할 수 있습니다.

on("change:graphic:left", function(obj) {
   //이 객체의 왼쪽 값은 이 때 어떻게 되나요?
   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()을 사용할 때 읽기 전용 속성의 선행 밑줄을 생략해야 합니다.

도움이 되었습니까?
107명 중 14명이 도움이 되었다고 했습니다.