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

スクリプトが正常に終了した場合は 0 を返し、そうでない場合はエラー番号を返します。次に、Objective-C コードで戻り値をテストし、エラーが発生した場合に「通常の」例外をスローして、通常の例外処理コードでそれを処理できるようにします。

これは機能しますが、Objective-C コードから直接 AppleScript 例外をトラップする方法はありますか? try-errorXCode でAppleScript コードなしでコードを実行すると、AppleScript から戻る前に例外ブレークポイントにヒットしたように見えますが@catchNSException. 何らかの形でヒットしている例外をキャッチする方法はありますか? 答えはノーだと思いますが、私がやっていることよりも良い方法がないことを確認したかったのです。AppleScript-ObjC に関する Apple のドキュメントはかなりまばらで、ほとんどは AppleScript 内でのエラーの処理について説明しているだけです。

更新: そこで、ブレークポイントの設定を少しいじってみたところ、Objective-C の例外ではなく、AppleScript コードから送信された C++ の例外であることがわかりました。だから@catch使っていたブロックに引っかからなかった。AppleScript-ObjC メカニズムは制御フロー/回復可能なエラーの例外を使用しているようで、それらがスローされたときにブレークするようにブレークポイントを設定しました。したがって、AppleScript アプリケーションでエラーをキャッチし、エラー コードを文字列または整数として Objective-C コードに返すのがおそらく最善だと思います。

4

1 に答える 1

0

AppleScript は C++ 例外を使用して独自の例外を実装しますが、それ以外は何もしません。正常に完了するコードには表示されません。AppleScript 例外が Objective-C に戻るポイントまでエスケープされた場合、ブリッジは実際にそれを飲み込みます。ログ メッセージと、ブリッジされたメソッドから nil/zero/NO の戻り値を取得する必要があります。これらすべての結果は、すでに正しいことを行っているということです。つまり、AppleScript でエラーをトラップし、Objective-C コードが検出できる何かを返します。

補足として、AppleScriptObjC は主に、主にまたは完全に AppleScript でアプリケーションを作成する開発者を対象としています。スクリプトを介して他のアプリケーションを制御するいくつかのビットを含む、主に Objective-C アプリケーションを作成している場合は、代わりに ScriptingBridge の使用を検討してください。

于 2013-08-06T00:09:08.060 に答える