用嵌入Cocoa应用程序中的AppleScript ObjC处理错误的最佳方法



我正在从一个更大的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异常?当我在XCode中运行没有AppleScript try-error代码的代码时,它似乎在从AppleScript返回之前到达了我的异常断点,但它从未调用NSException@catch块。有没有什么方法可以捕捉到以某种方式被击中的异常?我猜答案是否定的,但我想检查一下,没有比我现在做的更好的方法了。苹果关于AppleScript ObjC的文档相当稀疏,主要讨论的只是在AppleScript中处理错误。

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

AppleScript使用C++异常来实现自己的异常,但没有其他任何异常;您不应该在成功完成的代码中看到它们。如果AppleScript异常逃逸到返回Objective-C的点,那么桥接器实际上会将其吞噬——您应该从桥接的方法中获得一条日志消息和一个nil/zero/NO返回值。所有这些的结果是,你已经在做正确的事情:在AppleScript中捕获错误,并返回你的Objective-C代码可以检测到的东西。

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

最新更新