Ho un AppleScript che ho lavorato la scorsa settimana o giù di lì. Ho eseguito & ripetere una sceneggiatura, correggere bug, ecc. che sono nel profondo del codice. A volte, la sceneggiatura impiega molto tempo in un determinato passaggio o addirittura rende l'editor degli script non rispondente. In quei casi, stavo costringendo l'editor a uscire e riavviarlo per aggiungere alcune istruzioni di debug o provare un trucco per renderlo più veloce.
Bene, ad un certo punto oggi, ho provato a eseguire lo script dopo un arresto forzato, e tutto è iniziato casualmente in un ciclo in cima alla sceneggiatura che non avevo toccato per settimane. Tutto ciò che il ciclo fa è ripetere su una lista e aggiungere valori a una stringa: semplice. Tuttavia, si blocca in qualche modo in modo casuale in quel ciclo ogni volta che cerco di eseguirlo. Si bloccherà sulla stessa iterazione del ciclo (ad es. Su iterazione 2446) se non modifico il codice - ma se modifico & rieseguire, si blocca in un posto diverso. Quando ho aggiunto una finestra di dialogo a una specifica iterazione in cui pensavo fosse appesa in modo coerente, ha reso tutto il ciclo senza un blocco. Ho rimosso la finestra di dialogo e si è appeso di nuovo su una diversa iterazione ...?! Non c'è motivo per cui possa capire perché dovrebbe essere sospeso a questo punto all'inizio della sceneggiatura. Ho provato a riavviare il computer, eppure si bloccava ancora da qualche parte in quel primo ciclo.
Ho scaricato "Script Debugger 5" e ho provato a eseguire lo script da esso ... non si blocca più! Quindi sto iniziando a pensare che qualcosa sia successo all'Editor di Applescript, forse dai miei vari arresti forzati?
- La mia intuizione è corretta - che l'Editor è in qualche modo corrotto?
- Se l'editor è danneggiato, come posso ripararlo?
Ecco il ciclo (è il primo) che si blocca su un'iterazione di ciclo casuale. Sopra c'è molto poco codice, che è semplice e non è cambiato da mesi.
tell application "Contacts"
try
--with timeout of 5 seconds
set myEmails to value of first email of every person
set allemailsstr to ""
set myPhones to value of first phone of every person
set allphonesstr to ""
repeat with m from 1 to count of myEmails
if (item m of myEmails as string) is not "missing value" then
tell application "ASObjC Runner"
--with timeout of 1 second
set properties of progress window to {detail:"Collecting Email " & m & " of " & (count of myEmails) & " and Phone 0 of " & (count of myPhones)}
--end timeout
end tell
set allemailsstr to allemailsstr & item m of myEmails & "
"
end if
end repeat
repeat with m from 1 to count of myPhones
if (item m of myPhones as string) is not "missing value" then
tell application "ASObjC Runner"
with timeout of 1 second
set properties of progress window to {detail:"Collecting Email " & (count of myEmails) & " of " & (count of myEmails) & " and Phone " & m & " of " & (count of myPhones)}
end timeout
end tell
set allphonesstr to allphonesstr & item m of myPhones & "
"
end if
end repeat
--set the clipboard to allemailsstr
--end timeout
on error errStr
display dialog "Encountered a timeout while simply adding people to a list"
end try
end tell
Posso inserire il codice sopra se richiesto, ma come ho detto, è molto semplice - solo alcune dichiarazioni variabili, l'impostazione della barra di avanzamento della GUI e una finestra di dialogo di coppia. Il numero di contatti su cui si sta ripetendo è superiore a 8K.
FYI, il codice di timeout commentato non stava recuperando le impiccagioni. Quando si verificano gli hang, l'editor non risponde. Questo è uno script di lunga durata, misurato in ore.
UPDATE : Non penso più che l'Editor di Applescript sia corrotto in qualche modo. Sospetto che possa essere una sorta di limite di memoria (o qualche altro limite). Ecco perché. Quando eseguo lo stesso script in Applescript Editor su un altro computer (il mio computer di lavoro), ho ancora un blocco. Script Debugger continua a non bloccarsi.