我从一个较大的Cocoa/ObjC应用程序中调用一个小型AppleScript处理程序(使用AppleScript-ObjC框架直接从Objective代码调用AppleScript方法)。我最初尝试使用Scripting,但由于与外部应用程序的兼容性问题,这对我无效。AppleScript的唯一目的本质上是向外部应用程序发送一个小字符串。这是我第一次尝试这样做来控制外部应用程序,所以如果我犯了一个明显的错误,请耐心等待。
有时,AppleScript可能会遇到错误,这取决于外部应用程序的状态,我希望在目标C代码中适当地处理这些错误。
我现在这样做的方式是,在AppleScript中有一个try块:
try
-- Do stuff
return the number 0
on error the error_message number the error_number
return the error_number
end try如果脚本正常完成,我将返回零,如果没有返回,则返回错误号。然后,在Objective代码中,我测试返回值并在出现错误的情况下抛出一个“正常”异常,以便在我的常规异常处理代码中处理。
这是可行的,但是有什么方法可以直接从Objective代码中捕获AppleScript异常吗?当我在不使用AppleScript try-error代码的情况下运行XCode代码时,它似乎在从AppleScript返回之前命中了异常断点,但它从不为NSException调用@catch块。有什么办法可以抓住这个正在遭受打击的例外吗?我猜答案是否定的,但我想确认一下,没有比我正在做的更好的方法了。苹果关于AppleScript-ObjC的文档相当稀少,而且大多只是讨论AppleScript中的错误处理。
更新:所以,我只是尝试了一下断点设置,结果发现这是一个从C++代码发送的AppleScript异常,而不是目标C异常。这就是为什么它没有被我使用的@catch块捕获的原因。似乎AppleScript-ObjC机制使用异常来处理控制流/可恢复错误,并且我的断点设置为在抛出它们时中断。因此,我认为最好只捕获AppleScript应用程序中的错误,并将错误代码作为字符串或整数返回给目标C代码。
发布于 2013-08-06 00:09:08
AppleScript使用C++异常来实现自己的异常,但是没有其他的;您不应该在成功完成的代码中看到它们。如果一个AppleScript异常转到返回目标C的点,桥实际上就吞噬了它--您应该从桥接方法中得到一条日志消息和一个零/零/无返回值。这一切的结果是,您已经在做正确的事情:在AppleScript中捕获错误并返回您的目标-C代码可以检测到的内容。
顺便提一句,AppleScriptObjC主要是为主要或完全用AppleScript编写应用程序的开发人员准备的。如果您正在编写一个具有几个通过脚本控制其他应用程序的主要Objective应用程序,请考虑使用ScriptingBridge。
https://stackoverflow.com/questions/18000078
复制相似问题