Pergunta

Pergunta curta: a que se refere a "fonte" de uma exceção e como posso vinculá -lo à string/arquivo de origem relevante?

História mais longa:

Estou executando o código JavaScript em um aplicativo nativo do iPhone através [UIWebView stringByEvaluatingJavaScriptFromString:]. Para ajudar o desenvolvimento e posteriormente verificar o código fornecido pelo usuário, uso a seguinte função para executar com segurança qualquer código:

// 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;
}

Se tudo correr bem, [MyJS runJS:js] Executa bom e retorna uma string json que contém o resultado da avaliação da última instrução no código 'JS'.

Agora, se as coisas ruins acontecerem durante a avaliação, recebo um objeto de exceção jsonificado. Por exemplo, no caso de um erro de sintaxe no código 'JS', eu recebo algo assim:

{"Mensagem": "Erro de análise", "Linha": 1, "SourceID": 26121296}

O que já é bastante útil para rastrear problemas ...

No entanto, enquanto eu corro várias cordas através runJS:, Eu gostaria de poder identificar qual deles causou a exceção (porque um erro de tempo de execução poderia vir de uma função criada em uma string de código JavaScript anterior). Esta propriedade "SourceID" parece interessante, mas não consigo encontrar o que aponta. Parece um endereço de ponteiro (valor semelhante aos ponteiros a outros objetos), mas não corresponde a nenhuma das cordas que passei para o avaliador. Como posso fazer este link?

Para pontos de bônus: existe alguma documentação disponível sobre o ambiente JavaScript específico da UIWebView, como este objeto de exceção? o Guia de conteúdo da Web Safari é bom, mas não entra nesse tipo de detalhes.

Foi útil?

Solução

Solução de pior caso:

Dentro de cada string js sendo avaliada, adicione algum código que joga uma exceção, pega -o, extrai o fonte e de alguma forma o expõe para que o runJS: O método pode manter um registro do qual o SourceID acompanha qual string.

(Espero que alguém encontre uma maneira melhor e ajude a enterrar essa resposta feia!)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top