Работа с ошибками
Это приложение обеспечивает подробный пример ошибок из-за неправильного обращения с Операторами попытки и ошибочными Операторами. Это показывает, как использовать a try
оператор для проверки на неправильных данных и другие ошибки, и error
оператор для передачи любой ошибки, которая не может быть обработана. Это также показывает, как проверить на просто определенный код ошибки, что Вы интересуетесь.
Фиксация ошибок в обработчике
SumIntegerList
обработчик ожидает список целых чисел. Если какой-либо элемент в переданном списке не является целым числом, SumIntegerList
сигналы error number 750
и возвраты 0. Обработчик включает обработчик ошибок, выводящий на экран диалоговое окно, если код ошибки равен 750; если код ошибки не равен 750, обработчик повторно сигнализирует ошибку с error
оператор так, чтобы другие операторы в цепочке вызовов могли обработать неизвестную ошибку. Если никакой оператор не обрабатывает ошибку, AppleScript выводит на экран ошибочное диалоговое окно и остановки выполнения.
on SumIntegerList from itemList |
try |
-- Initialize return value. |
set integerSum to 0 |
-- Before doing sum, check that all items in list are integers. |
if ((count items in itemList) is not equal to ¬ |
(count integers in itemList)) then |
-- If all items aren’t integers, signal an error. |
error number 750 |
end if |
-- Use a repeat statement to sum the integers in the list. |
repeat with currentItem in itemList |
set integerSum to integerSum + currentItem |
end repeat |
return integerSum -- Successful completion of handler. |
on error errStr number errorNumber |
-- If our own error number, warn about bad data. |
if the errorNumber is equal to 750 then |
display dialog "All items in the list must be integers." |
return integerSum -- Return the default value (0). |
else |
-- An unknown error occurred. Resignal, so the caller |
-- can handle it, or AppleScript can display the number. |
error errStr number errorNumber |
end if |
end try |
end SumIntegerList |
SumIntegerList
обработчик обрабатывает различные состояния ошибки. Например, следующий вызов завершается без ошибки:
set sumList to {1, 3, 5} |
set listTotal to SumIntegerList from sumList --result: 9 |
Следующий вызов передает неправильных данных — список содержит элемент, который не является целым числом:
set sumList to {1, 3, 5, "A"} |
set listTotal to SumIntegerList from sumList |
if listTotal is equal to 0 then |
-- the handler didn’t total the list; |
-- do something to handle the error (not shown) |
end if |
SumIntegerList
подпрограмма проверяет список и сигнализирует ошибку 750, потому что список содержит по крайней мере один элемент нецелого числа. Обработчик ошибок подпрограммы распознает код ошибки 750 и поднимает диалоговое окно для описания проблемы. SumIntegerList
подпрограмма возвращается 0. Сценарий проверяет возвращаемое значение и, если это равно 0, делает что-то для обработки ошибки (не показанный).
Предположим, что некоторая неизвестная ошибка происходит в то время как SumIntegerList
обрабатывает целочисленный список в предыдущем вызове. Когда неизвестная ошибка происходит, SumIntegerList
обработчик ошибок вызывает error
команда, чтобы повторно сигнализировать ошибку. Так как вызывающая сторона не обрабатывает его, AppleScript выводит на экран ошибочное диалоговое окно и остановы выполнения. SumIntegerList
подпрограмма не возвращает значение.
Наконец, предположите, что вызывающая сторона имеет свой собственный обработчик ошибок, так, чтобы, если обработчик передает ошибку, вызывающая сторона могла обработать его. Предположите снова, что неизвестная ошибка происходит в то время как SumIntegerList
обрабатывает целочисленный список.
try |
set sumList to {1, 3, 5} |
set listTotal to SumIntegerList from sumList |
on error errMsg number errorNumber |
display dialog "An unknown error occurred: " & errorNumber as text |
end try |
В этом случае, когда неизвестная ошибка происходит, SumIntegerList
обработчик ошибок вызывает error
команда, чтобы повторно сигнализировать ошибку. Поскольку вызывающая сторона имеет обработчик ошибок, она в состоянии обработать ошибку путем отображения диалогового окна, включающего код ошибки. Выполнение может продолжаться, если это значимо, чтобы сделать так.
Упрощенная проверка ошибок
AppleScript обеспечивает механизм для оптимизации способа, которым можно поймать и обработать отдельные ошибки. Часто необходимо для сценария обработать определенную ошибку, но не других. Возможно зафиксировать ошибку, проверить на код ошибки, Вы интересуетесь и используете ошибочный оператор, чтобы повторно сигнализировать для других ошибок. Например:
try |
open for access file "MyFolder:AddressData" with write permission |
on error msg number n from f to t partial result p |
if n = -49 then -- File already open error |
display dialog "I'm sorry but the file is already open." |
else |
error msg number n from f to t partial result p |
end if |
end try |
Этот сценарий пытается открыть файл с разрешением записи, но если файл уже открыт, это просто выводит на экран диалоговое окно. Однако можно вместо этого реализовать это более кратко как:
try |
open for access file "MyFolder:AddressData" with write permission |
on error number -49 |
display dialog "I'm sorry but the file is already open." |
end try |
В этой версии нет никакой потребности перечислить message
, from
, to
, или partial result
параметры, для проведения их. Если ошибка не-49 (файл <имя> уже открыт), этот обработчик ошибок не зафиксирует ошибку, и AppleScript передаст ошибку следующему обработчику во внешнем объеме.
Один недостаток к этому подходу - то, что необходимо использовать литеральную константу для кода ошибки в on error
список параметров. Вы не можете использовать глобальную переменную или имена свойства, потому что число должно быть известно, когда компилируется сценарий.