AppleScript для абсолютных новичков

Дата публикации:18.07.2012
Поделиться в Twitter Поделиться в F******k Поделиться в VKontakte Поделиться в Telegram Поделиться в Mastodon

Глава 11. Пытаемся избежать сбоев

Во всех сценариях, которые мы обсуждали до сих пор, предполагалось, что если AppleScript в процессе выполнения столкнется с ошибкой, то выполнение сценария завершится.

beep
set x to 1 / 0	[1]
say "You will never hear this!" -- вы этого никогда не услышите

Если вы проверите синтаксис сценария [1], AppleScript не сообщит о каких-либо проблемах. Однако, если запустить сценарий, вы не услышите фразы [1.3], потому что выполнение сценария остановится на операторе [1.2], даже несмотря на правильность оператора [1.3].

Конечно, завершение сценария не обязательно именно то, чего вы ожидаете. Например, если ваш сценарий требует наличия папки с файлами для работы, и папка была удалена, имеет смысл предоставить пользователю возможность выбрать другую папку.

Когда пишется сценарий, вы должны определять операторы, которые чувствительны к проблемам в процессе выполнения. Заключите эти операторы в блок try ... end tray, как продемонстрировано здесь [2].

try
beep
set x to 1 / 0
say "You will never hear this!"	[2]
end try
say "The error does not stop this sentence being spoken" -- ошибка не остановит произнесение этой фразы

Теперь, если запустить сценарий, вы услышите вторую фразу [2.6], так как AppleScript продолжит выполнение сценария после оператора "end try" [2.4].

В главе 7, в которой обсуждались записи, мы столкнулись со следующим сценарием [3]

set temp to display dialog "What is your age in years?" default answer ""
set ageEntered to text returned of temp	[3]
set ageInMonths to ageEntered * 12
display dialog "Your age in months is " & ageInMonths

Проблема в этом сценарии в том, что пользователь введёт что-либо еще вместо числа, и в сценарии будет сбой. Мы можем избежать прерывание работы сценария, и обеспечить пользователя полезной обратной связью [4].

set temp to display dialog "What is your age in years?" default answer ""
set ageEntered to text returned of temp
try
-- Сначала проверим, что пользователь ввел число
set ageEntered to ageEntered as number
set ageInMonths to ageEntered * 12
display dialog "Your age in months is " & ageInMonths	[4]
on error
-- Если это не число, то ввод должно быть является текстом.
display dialog "Instead of a number, like 30, you entered text."
-- В отличие от числа, подобного 30, вы ввели текст.
end try

Теперь, если пользователь введет не число, он будет обеспечен обратной связью. Единственное неудобство в том, что пользователь должен запустить сценарий еще раз. В главе 13 мы решим и эту проблему.

В Script Editor очень легко заключать текст в блоки try. Просто выберите один или несколько операторов, которые вы хотите включить в блок try, и через контекстное меню, выберите нужный пункт в подменю "Error Handlers", такой например как использован в сценарии [5].

Когда сценарий переключится на часть "on error" блока try, у AppleScript будет для вас пара полезных вещей: номер ошибки и описание проблемы (зачастую оно зашифровано).

try
set x to 1 / 0
on error the error_message number the error_number
display dialog "Error: " & the error_number & ". " & the error_message 	[5]
buttons {"OK"} default button 1
end try

Если вы поместите имя переменной после "on error", описание проблемы будет присвоено этой переменной. Если имени переменной предшествует "number", то этой переменной будет присвоен номер ошибки. В операторе [5.3] мы имеем оба варианта.

Дополнительная информация

  1. Полный вариант книги (rtf/7z)-- электронная книга с сохранением иллюстраций, форматирования, изменений в цвете шрифта.


Распространение материалов сайта означает, что распространитель принял условия лицензионного соглашения.
Идея и реализация: © Владимир Довыденков и Анатолий Камынин,  2004-2024