4

我正在从一个较大的 Cocoa/Objective-C 应用程序中调用一个小的 AppleScript 处理程序(使用 AppleScript-ObjC 框架直接从 Objective-C 代码调用 AppleScript 方法)。我最初尝试使用 Scripting Bridge,但由于与外部应用程序的兼容性问题,这对我不起作用。AppleScript 的唯一目的本质上是向外部应用程序发送一个小字符串。这是我第一次尝试做这样的事情来控制外部应用程序,所以如果我犯了一个明显的错误,请多多包涵。

有时,AppleScript 可能会根据外部应用程序的状态遇到错误,我想在我的 Objective-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-C 代码中,我测试返回值并在出现错误的情况下抛出一个“正常”异常,这样我就可以在我的常规异常处理代码中处理它。

这可行,但是有没有办法直接从 Objective-C 代码中捕获 AppleScript 异常?当我try-error在 XCode 中运行没有 AppleScript 代码的代码时,它似乎在从 AppleScript 返回之前命中了我的异常断点,但它从不@catch调用NSException. 有什么方法可以捕获以某种方式被击中的异常吗?我猜答案是否定的,但我想检查是否没有比我正在做的更好的方法来做到这一点。Apple 关于 AppleScript-ObjC 的文档相当稀少,而且大多只是讨论处理 AppleScript 中的错误。

更新:所以,我只是尝试了一点断点设置,结果发现这是从 AppleScript 代码发送的 C++ 异常,而不是 Objective-C 异常。这就是为什么它没有被@catch我正在使用的块捕获。AppleScript-ObjC 机制似乎对控制流/可恢复错误使用异常,并且我将断点设置为在它们被抛出时中断。因此,我认为最好只捕获 AppleScript 应用程序中的错误,并将错误代码作为字符串或整数返回到 Objective-C 代码。

4

1 回答 1

0

AppleScript 使用 C++ 异常来实现自己的异常,但仅此而已;您不应该在成功完成的代码中看到它们。如果 AppleScript 异常逃逸到返回到 Objective-C 的点,桥实际上会吞下它——您应该得到一条日志消息,以及来自桥接方法的 nil/零/NO 返回值。所有这一切的结果是您已经在做正确的事情:在 AppleScript 中捕获错误并返回您的 Objective-C 代码可以检测到的内容。

附带说明一下,AppleScriptObjC 主要面向主要或完全使用 AppleScript 编写应用程序的开发人员。如果您正在编写一个主要的 Objective-C 应用程序,其中包含一些通过脚本控制其他应用程序的位,请考虑改用 ScriptingBridge。

于 2013-08-06T00:09:08.060 回答