错误处理(很多计算机语言中叫做“异常处理”即Exception Handling,但在AppleScript中却叫做“Error Handling”)是所有脚本或程序设计所要面对的重要课题。 在脚本运行时,时常会遇到意外的错误,如:文件不存在。
基本的Try语句
首先要了解一个原则:脚本执行过程中,如果遇到错误时,将立即退出脚本运行,之后的代码将不会运行。
基本的try语句就是告诉Mac,如果遇到错误就忽略掉,不执行这条代码,转而执行try语句之后的代码。
try
--statement
end try
举一个简单的例子,来说明try的用途:
tell application "Finder"
make new folder at desktop with properties {name:"AppleScript"}
end tell
display dialog "Success!"
执行上面代码第一次将在桌面上建立名为“AppleScript”的文件夹,并会看到显示有“Success!”的对话框,但是如果继续执行第二次,便会发生错误,并且不会看到对话框(原因是已经存在了同名文件夹)。 现在将前三行代码(tell块),用try --- end try 包裹起来,再执行它,你会发现无论执行多少次这个脚本,都能看到Success对话框。
带有错误处理的Try语句
所谓带有错误处理,即我们不再像基本Try语句那样直接忽略掉引起错误的代码,而是要对发生的错误进行负责任地处理。
try
--do something at risk 做一些可能导致错误的事情
on error errText number errNum
--do something to handle error 做一些处理错误的事情
end try
其中: errText 是自定义变量名,它将包含遇到错误的信息,是text格式的。
number 为关键字,后跟一个变量名(例中为errNum),这个变量将包含错误号码。
比起基本Try语句,多了on error那一行(注意:on error在这里是必须的,errText number errNum是可以省略的)。
习惯上,在 on error 和 end try 之间,一般都会包含一个if语句,来检查错误类型,并对不同的错误进行不一样的处理。
AppleScript中的错误(Error)
抛出一个自定义错误
error "自定义一个错误" number 999
上面这行代码什么有意义的事情也没做,只是告诉AppleScript运行器“我遇到错误了!”。 error后面紧跟一个text用于说明错误内容,number关键字后跟一个数字指定错误代码---注意:通常不要让这个数字和系统预定义的错误代码相同。
系统预定义的错误
在AppleScript中,预定义了很多错误:如 error number - 128 是“User Cancelled.” (用户取消); error number - 43 是“File wasn't found.”(未找到xx文件)。
错误处理实例
try
display dialog "您确定要在桌面上创建名为“AppleScript Folder”的文件夹吗?"
tell application "Finder"
make new folder at desktop with properties {name:"AppleScript Folder"}
end tell
on error eText number eNum
if (eNum = -48) then
display dialog "发生文件错误,错误内容为:\n" & eText
else if (eNum = -128) then
display dialog "您按下了取消按钮,错误内容为:\n" & eText
end if
end try
超时(Timeout)
AppleScript经常要与用户或者其他应用程序交互,当AppleScript发送出了一条命令后,它将等待接受用户或者应用程序的响应。 默认情况下AppleScript将等待120秒,如果在120秒内没有得到响应,将会抛出“AppleEvent已超时。” number - 1712 错误。 不过,120秒不是适合所有情况的,如果需要自己确定一个等待时间,那么将要用到TimeOut语句,其语法如下:
with timeout of x seconds --x 必须为整数
--wait for something
end timeout
上面的语句告诉脚本,在wait for something中最多只等待x秒,如果x秒过后,仍然没有得到预期响应,就会抛出超时错误。
需要说明的是: x是可以大于120的! 这样就突破了AppleScript默认的等待时间,有时候也是有用的。
下面以举例说明timeout语法具体用法:
with timeout of 3 seconds
display dialog "我最多等你三秒"
end timeout
display dialog "你的确在三秒内做出了响应"
如果在三秒内的确按下了对话框中的按钮,那么脚本随后跳出下一个对话框。 如果没有在三秒内按下对话框中任意按钮,脚本抛出错误。
附录: 预定义的错误代码和错误信息
AppleScript错误:
错误代码 错误信息
-2700 Unknown error.
-2701 Can’t divide <number> by zero.
-2702 The result of a numeric operation was too large.
-2703 <reference> can't be launched because it is not an application.
-2704 <reference> isn't scriptable.
-2705 The application has a corrupted dictionary.
-2706 Stack overflow.
-2707 Internal table overflow.
-2708 Attempt to create a value larger than the allowable size.
-2709 Can't get the event dictionary.
-2720 Can't both consider and ignore <attribute>.
-2721 Can't perform operation on text longer than 32K bytes.
-2729 Message size too large for the 7.0 Finder.
-2740 A <language element> can't go after this <language element>.
-2741 Expected <language element> but found <language element>.
-2750 The <name> parameter is specified more than once.
-2751 The <name> property is specified more than once.
-2752 The <name> handler is specified more than once
-2753 The variable <name> is not defined.
-2754 Can't declare <name> as both a local and global variable.
-2755 Exit statement was not in a repeat loop.
-2760 Tell statements are nested too deeply.
-2761 <name> is illegal as a formal parameter.
-2762 <name> is not a parameter name for the event <event>.
-2763 No result was returned for some argument of this expression.
Mac OS系统错误
错误代码 错误信息
0 No error.
-34 Disk <name> full.
-35 Disk <name> wasn’t found.
-37 Bad name for file.
-38 File <name> wasn’t open.
-39 End of file error.
-42 Too many files open.
-43 File <name> wasn’t found.
-44 Disk <name> is write protected.
-45 File <name> is locked.
-46 Disk <name> is locked.
-47 File <name> is busy.
-48 Duplicate file name.
-49 File <name> is already open.
-50 Parameter error.
-51 File reference number error.
-61 File not open with write permission.
-108 Out of memory.
-120 Folder <name> wasn’t found.
-124 Disk <name> is disconnected.
-128 User cancelled.
-192 A resource wasn’t found.
-600 Application isn’t running
-601 Not enough room to launch application with special requirements.
-602 Application is not 32-bit clean.
-605 More memory needed than is specified in the size resource.
-606 Application is background-only.
-607 Buffer is too small.
-608 No outstanding high-level event.
-609 Connection is invalid.
-904 Not enough system memory to connect to remote application.
-905 Remote access is not allowed.
-906 <name> isn’t running or program linking isn’t enabled.
-915 Can’t find remote machine.
-30720 Invalid date and time <date string>