Po wykryciu błędu w ExtendScript, chciałbym móc zarejestrować jego ślad stosu. Wygląda na to, że błędy nie zawierają śladów stosu w ExtendScript, więc bawię się z pomysłem dodawania śladów stosu do błędów.Uzyskiwanie śladu stosu błędu w ExtendScript
Jedynym sposobem, wiem, aby uzyskać ślad stosu jest $.stack
. Pole $.stack
zawiera bieżący ślad stosu w momencie uzyskania dostępu do pola.
Moja pierwsza próba polegała na utworzeniu własnego obiektu błędu zawierającego stos. Obiekt Error
jest bardzo wyjątkowy, ponieważ może pobrać linię i nazwę pliku kodu, który go utworzył. Na przykład,
try {
throw new Error("Houston, we have a problem.");
}
catch (e) {
$.writeln("Line: " + e.line);
$.writeln("File: " + e.fileName);
$.writeln("Message: " + e.message);
}
wypisze:
Line: 2
File: ~/Desktop/Source1.jsx
Message: Houston, we have a problem.
Nie sądzę, że to możliwe, aby stworzyć swój własny obiekt z tej zdolności. Najbliżej mogę dostać to:
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);
}
która drukuje:
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)
Tutaj widzimy, że tworzę mój własny obiekt o błędzie i wyraźnie przekazując mu nazwę pliku i linii (od MyError nie potrafię tego zrobić samodzielnie). Uwzględniłem także bieżący stos, gdy błąd zostanie utworzony.
Działa to dobrze, gdy zgłoszę mój własny obiekt o błędzie, ale to nie działa, gdy inny kod wywołuje regularne obiekt błędu lub gdy błąd jest generowany automatycznie (na przykład poprzez nielegalny dostęp). Chcę być w stanie uzyskać ślad stosu dowolnego błędu, bez względu na sposób jego generowania.
Inne podejścia to modyfikacja konstruktora Error
, modyfikacja prototypu Error
lub całkowite zastąpienie obiektu Error
. Nie udało mi się uzyskać żadnego z tych podejść do działania.
Innym pomysłem byłoby umieścić blok catch w każdym sposobie mojego kodu i dodać bieżący stos do błędu, jeśli nie masz. Chciałbym omijać tę opcję, jeśli to możliwe.
Brakuje mi pomysłów. Czy istnieje sposób, aby uzyskać ślad stosu błędów?
Byłbym bardzo zainteresowany, gdyby coś działało. Mój największy problem polega na tym, że zaraz po skompilowaniu do formatu jsxbin nie otrzymuję nic użytecznego od błędów. Poszedłem na trasę niesamowitej ilości zdarzeń, więc mogę debugować. –
Personalny sposób użycia instrukcji $ .write lub $ .writeln. Przede wszystkim przyniosą ExtendScript Toolkit z góry, jeśli nie zostaną otwarte. To może być bardzo mylące dla użytkowników końcowych, jeśli nie są oni ostrzeżeni. Również może być naprawdę bardzo wolny, szczególnie w pętlach wewnętrznych. Wolę zapisywać pliki dziennika na dysku. Mam swój własny przepis, ale możesz skorzystać z tej biblioteki: http: //creative-scripts.com/logging-with-a-smile/ – Loic