14 9月, 2016

错误处理

内容纲要

错误处理(很多计算机语言中叫做“异常处理”即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>

You may also like...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注