2011-10-05 2 views
4

Dans mes programmes ClojureScript exécutés dans FireFox 5.0 sur Ubuntu 10.04.1 LTS, je reçois une seule ligne cryptique lorsqu'une exception est levée.Obtention de traces de pile dans ClojureScript

'Erreur: Aucune méthode de protocole ISeqable.-seq défini pour objet de type: [object Object]' lorsque la méthode d'appel: [nsIDOMEventListener :: handleEvent]

Le "-seq" me semble peu étrange et je ont cherché les fichiers javascript générés pour cela et ne pas trouvé.

J'espère ne pas manquer quelque chose d'évident, mais comment obtenir une trace de pile de l'exception lancée? Comment débuggez-vous vos scripts?

+0

Y a-t-il un utilisateur de ClojureScript ici qui a eu ce besoin et qui a compris comment? – Synk

+0

Vous devriez obtenir des traces de piles de Firefox et Chrome maintenant. – dnolen

Répondre

1

On dirait que vous passez un objet Javascript à une fonction Clojurescript qui attend une séquence Clojure. Essayez (my-function (js->clj my-thing)) modifier: ou, je suppose que vous utilisez (.strobj) où vous n'avez pas besoin de

+0

J'ai corrigé cette erreur particulière mais je ne me souviens plus de la cause première. Mais mon problème est plus que cette erreur particulière. Je ne me souviens pas d'avoir vu une seule trace de pile et toute erreur de l'exécution de CLJS m'oblige à placer des sondes à des emplacements aléatoires et à essayer de les réduire. Mon niveau d'optimisation est fixé à: simple et avec ce que j'espérais obtenir des informations utiles. Il doit y avoir une meilleure approche pour déboguer clojurescript, non? – Synk

+0

dunno! l'étape de compilation signifie que vous êtes trop loin du code original. Je suppose qu'un mappage vers le code d'origine pourrait être inclus dans une future option de débog-compilation (en utilisant des métadonnées et des macros intelligentes), mais pour l'instant il s'agit d'utiliser la console et de tester avec des fonctions simplifiées pour isoler le problème. Je trouve que la plupart de mes erreurs sont causées par l'envoi du mauvais type dans une fonction, par ex. envoyer un atome sans déréférencement ou un objet json au lieu d'un objet clojure. L'autre type d'erreur que je fais confond la syntaxe interop javascript. – Hendekagon

1

Malheureusement, les traces de pile provenant d'erreurs dépendent du support du navigateur. La plupart des navigateurs (tous?) Vous permettent d'accéder à une version standard de la trace de la pile (habituellement les 10 éléments principaux, iirc) en déréférenciant le champ 'pile', ce qui vous permet de:

(try ...throws... 
    (catch js/Error e 
     (.log js/console (.-stack e)))) 

Cependant, les traces de pile de chaînes ne sont pas très amusantes, vous ne pouvez pas cliquer dessus pour vous diriger vers la source. Il est préférable d'imprimer le répertoire d'exception sur la console javascript (si elle est disponible) pour imprimer les traces de pile avec des liens cliquables. Par exemple.

(try ...throws... 
    (catch js/Error e 
     (.log js/console e))) 

Au moins en chrome, cela ne fonctionne que si la console javascript était ouverte lorsque l'erreur a été levée. C'est excellent pour le débogage, mais moins utile lorsque l'erreur était inattendue.

Les objets de la console javascript fournis par la plupart des navigateurs ont beaucoup de fonctions utiles que vous pouvez utiliser depuis clojurescript. Si vous voulez obtenir des numéros de ligne utiles, vous voudrez probablement écrire quelques macros pour injecter le code à imprimer sur la console, sinon tous vos numéros de ligne pointeront vers votre fonction d'impression.

Questions connexes