Как связать sourceId исключения JavaScript UIWebView с исходным файлом? - PullRequest
3 голосов
/ 11 января 2010

Короткий вопрос: на что ссылается «sourceID» исключения и как я могу связать его с соответствующей исходной строкой / файлом?

Более длинная история:

Я запускаю код Javascript в родном приложении iPhone через [UIWebView stringByEvaluatingJavaScriptFromString:]. Чтобы помочь в разработке, а затем проверить предоставленный пользователем код, я использую следующую функцию для безопасного запуска любого кода:

// Inside @implementation MyJS
- (NSString *)runJS:(NSString *)js {
    // Do some escaping on 'js' to make it look like a string literal.
    js = escape(js);
    NSString *result =
        [webView stringByEvaluatingJavaScriptFromString:
            [NSString stringWithFormat:@"try { JSON.stringify(eval(\"%@\")); } except (e) { JSON.stringify(e); }", js]
        ];
    return result;
}

Если все идет хорошо, [MyJS runJS:js] работает нормально и возвращает строку JSON, содержащую результат вычисления последнего оператора в коде 'js'.

Теперь, если во время оценки происходят плохие вещи, я получаю объект исключения JSONified. Например, в случае синтаксической ошибки в коде 'js' я получаю что-то вроде этого:

{"message": "Ошибка разбора", "строка": 1, "sourceId": 26121296}

Что уже весьма полезно для отслеживания проблем ...

Однако, когда я запускаю несколько строк через runJS:, я хотел бы иметь возможность точно определить, какая из них вызвала исключение (поскольку ошибка времени выполнения может исходить от функции, созданной в предыдущей строке кода javascript). Это свойство «sourceId» выглядит интересно, но я не могу найти то, на что оно указывает. Он выглядит как адрес указателя (значение, аналогичное указателям на другие объекты), но не соответствует ни одной из строк, которые я передал в оценщик. Как я могу сделать эту ссылку?

Для бонусных баллов: есть ли какая-либо документация о Javascript-среде, специфичной для UIWebView, например об объекте исключения? Руководство по веб-контенту Safari приятно, но не вдаваться в подробности такого рода.

1 Ответ

2 голосов
/ 11 января 2010

Решение наихудшего случая:

Внутри каждой оцениваемой строки js добавьте некоторый код, который генерирует исключение, перехватывает его, извлекает sourceId и каким-то образом предоставляет его, чтобы метод runJS: мог вести записьиз которых sourceId идет с какой строкой.

(Надеюсь, кто-то найдет лучший способ и поможет похоронить этот уродливый ответ!)

...