Tengo un applecript en el que he estado trabajando la semana pasada. He estado corriendo & volver a ejecutar un script, corregir errores, etc. que están en lo profundo del código. A veces, el script tardaría mucho tiempo en un cierto paso, o incluso haría que el editor del script no responda. En esos casos, forzaba al editor a salir y lo volvía a iniciar para agregar algunas declaraciones de depuración o intentar un truco para hacerlo más rápido.
Bueno, en algún momento de hoy, intenté ejecutar el script después de un cambio de fuerza, y comenzó a colgar al azar en un bucle en la parte superior del script que no había tocado durante semanas. Todo lo que hace el ciclo es repetir en una lista y agregar valores a una cadena: simple. Sin embargo, se cuelga de forma aleatoria en ese bucle cada vez que intento ejecutarlo. Se bloqueará en la misma iteración de bucle (por ejemplo, en la iteración 2446) si no edito el código, pero si edito & Ejecute de nuevo, se cuelga en un lugar diferente. Cuando agregué un cuadro de diálogo a una iteración específica en la que pensé que se colgaba de forma consistente, se abrió paso a través del bucle sin ningún problema. Quité el diálogo y se colgó de nuevo en una iteración diferente ...?! No hay ninguna razón por la que pueda ver por qué debería estar colgado en este punto al principio del script. Intenté reiniciar la computadora, pero aún así se colgaría en algún lugar de ese primer bucle.
Descargué "Script Debugger 5" e intenté ejecutar el script desde él ... ¡no más bloqueos! Así que estoy empezando a pensar que algo le sucedió al Editor de Apple, ¿tal vez de mis varios cambios de fuerza?
- ¿Es correcta mi intuición: que el Editor está dañado de alguna manera?
- Si el Editor está dañado, ¿cómo lo reparo?
Aquí está el bucle (es el primero) que se cuelga en una iteración de bucle aleatorio. Hay muy poco código arriba, lo cual es simple y no ha cambiado en meses.
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
Puedo publicar el código anterior si lo solicito, pero como dije, es muy simple: solo algunas declaraciones de variables, la configuración de la barra de progreso de la GUI y un par de ventanas de diálogo. El número de contactos en los que se repite es superior a 8K.
Para su información, el código de tiempo de espera comentado no estaba detectando los bloqueos. Cuando ocurren los bloqueos, el editor no responde. Este es un script de larga duración, medido en horas.
ACTUALIZACIÓN : ya no creo que el Editor de Apple esté dañado de alguna manera. Sospecho que puede ser algún tipo de límite de memoria (o algún otro límite). Este es el por qué. Cuando ejecuto el mismo script en Applescript Editor en una computadora diferente (mi computadora de trabajo), todavía me cuelgan. El depurador de secuencias de comandos aún no se bloquea.