Quando rilevo un errore in ExtendScript, vorrei poter registrare la traccia dello stack. Sembra che gli errori non contengano tracce di stack in ExtendScript, quindi mi sto prendendo gioco dell'idea di aggiungere tracce di stack agli errori.Come ottenere la traccia dello stack di un errore in ExtendScript
L'unico modo che conosco per ottenere una traccia stack è $.stack
. Il campo $.stack
contiene la traccia dello stack corrente nel momento in cui si accede al campo.
Il mio primo tentativo è stato creare il mio oggetto errore che includesse lo stack. L'oggetto Error
è molto speciale in quanto può ottenere la riga e il nome file del codice che lo ha creato. Ad esempio,
try {
throw new Error("Houston, we have a problem.");
}
catch (e) {
$.writeln("Line: " + e.line);
$.writeln("File: " + e.fileName);
$.writeln("Message: " + e.message);
}
stamperà:
Line: 2
File: ~/Desktop/Source1.jsx
Message: Houston, we have a problem.
non credo sia possibile creare il proprio oggetto con questa capacità. Il più vicino che posso ottenere è questo:
function MyError(msg, file, line) {
this.message = msg;
this.fileName = file;
this.line = line;
this.stack = $.stack;
}
try {
throw new MyError("Houston, we have a problem.", $.fileName, $.line);
}
catch (e) {
$.writeln("Line: " + e.line);
$.writeln("File: " + e.fileName);
$.writeln("Message: " + e.message);
$.writeln("Stack: " + e.stack);
}
che stampa:
Line: 9
File: ~/Desktop/Source2.jsx
Message: Houston, we have a problem.
Stack: [Source3.jsx]
MyError("Houston, we have a p"...,"~/Desktop/Source2.js"...,9)
Qui possiamo vedere che sto creando il mio proprio oggetto di errore e in modo esplicito passandogli il nome della linea e il file (dal MyError non riesco a capirlo da solo). Ho anche incluso lo stack corrente quando viene creato l'errore.
Questo funziona correttamente quando chiamo il mio oggetto errore, ma non funziona quando un altro codice chiama l'oggetto Error normale o quando viene generato automaticamente un errore (ad esempio tramite accesso illegale). Voglio essere in grado di ottenere la traccia dello stack di qualsiasi errore, indipendentemente da come viene generato.
Altri approcci potrebbero essere modificare il costruttore di Error
, modificare il prototipo di Error
o sostituire interamente l'oggetto Error
. Non sono stato in grado di far funzionare nessuno di questi approcci.
Un'altra idea sarebbe quella di mettere un blocco catch in ogni singolo metodo del mio codice e aggiungere lo stack corrente all'errore se non ne ha già uno. Vorrei evitare questa opzione se possibile.
Sono fuori di idee. C'è un modo per ottenere la traccia dello stack di errori?
Sarei davvero interessato se si ottiene qualcosa di lavoro. Il mio problema più grande è che non appena compilo in un formato jsxbin non ottengo nulla di utile dagli errori. Ho seguito il percorso di un'incredibile quantità di registrazione, quindi posso eseguire il debug di questo. –
Personnaly Non ho usato le istruzioni $ .write o $ .writeln. Prima di tutto porteranno in anticipo il Toolkit di ExtendScript se non lo hai aperto. Questo può davvero confondere gli utenti finali se non non sono avvertiti. Inoltre può essere davvero molto lento, specialmente all'interno dei loop. Preferisco scrivere file di registro sul disco. Ho la mia ricetta ma puoi approfittare di questa libreria: http: //creative-scripts.com/logging-with-a-smile/ – Loic