時移植のJavaコードをObjC、どのようベストを代表するチェック済みの例外?

StackOverflow https://stackoverflow.com/questions/1117384

質問

また移植のJavaコードベースにCocoa/Objective-Cでの使用にデスクトップMac OS Xで動作します。Javaコード ロットロット の方法を確認の例外のように:

double asNumber() throws FooException {
    ...
}

何が最良の方法はこれらのObjective-C?例外やエラー出パラメータ?

- (CGFloat)asNumber { 
    ... // possibly [FooException raise:format:];
}

または

- (CGFloat)asNumberError:(NSError **)outError {
    ...
}

私の感覚としての誤差は一般的には、より良い解決のためにObjective-Cが覧頂けます---多くの方法の一つとなるもぎこちない。とが ロット られないのです。

もちろんいいことから、 確認 例外のJava、追加する必要がありま @try ブロック if (*outError) {...} チェックもこれらのメソッド呼び出される(ロット 場所の集合).

思い出を聞いた後 @try ブロックが高価なので目的にしていただけますが、格安64ビットまたはSLやその他の新規envなリコールの正).私は全ての懸念の下位互換性で、きっと自分に合った 喜んでデザインのみの辛さ.

役に立ちましたか?

解決

すべ 絶対に避ける例外 う構文解析の数字から文字列です。にObjective-C、例外を表すプログラマのエラーは、ユーザー入力エラーも利用不可ファイルです。(その理由は例外処理は常に高く、複雑なにより"従来の"エラーになります。にかかわらずこ @try ブロックは"ゼロコスト"を64ビット, りのさるとしあきだいえっと遅くまで例外が実際に上げています。) もちろん、販売するチャコットが勝どきに複使用例として、自分の好きなような、ココア、大きな自分とその他のObjective-Cのコードです。利用者コードは非常に遠い例外をスローする場合と同じように、このエラーになります。

から アップルが自身のdocs:

"多くの環境での使用例は数多くのサービスを提供します。例えば、例外がスローされる信号が日常的な実行が通常の場合などはファイルがないか、またはデータを解析できなかったのを修正例外は資源集中にObjective-C使用例"が一般流制御は、単に意味を表す。くまの戻り値を使用方法や機能を表示するためにエラーが発生したについての情報を提供することは本質的に困難であるエラーオブジェクトです。"

いかに内蔵コの授業の取扱いのようなエラーです。例えば、 NSString はという方法 -floatValue このとき0を返しますが失敗します。より良いソリューションは、特定の状況がどのよう NSScanner いなど、 -scanFloat: —受け入れのポインタを果が格納された戻り YES または NO に基づきるかどうかの解析に成功しました。

ほかObejctive-C条約およびベストプラクティスNSErrorは堅牢かつ柔軟によNSException更新することができ、呼び出し側が効果的に無視し、問題れない。私は読書を通じて エラー処理プログラミングガイドココア. 注意: 場合は受け入れ NSError** paramしていまデザインのお客様へのパス NULL たくないとお考えの場合は受信エラー情報です。各ココアクラスの知識はこのエラーを含め、NSString.

は、移植されるコードが見つからのJavaコードを認識することを利用Objective-Cコードでは、同じでないお客様は、"Java等価です。あのイディオムの開されたものの翻訳であります。のポートすということではありませんミラーイメージは、Javaコードで、より正しい(Objective-C、結果として

他のヒント

Cocoaでは、例外は本当にだけのために使用されることになっている、「プログラミング・エラー;」哲学は、アプリがそれらをキャッチさせ、ユーザーに彼らがやっていることを保存するオプションを与え、そして終了することです。一つには、必ずしもすべてのフレームワークやコードパスは、100%の例外安全であり、これは、アクションの唯一の安全なコースすることができます。予想してから回収することができるエラーについて、あなたは一般的に、アウトパラメータで、NSErrorを使用する必要があります。

あなたは「アウトエラーは、一般的にObjCのためのよりよい解決策である」ことが正しいです。 (あなたはAPIのための前提条件を満たしていないが、その場合には、動作はデフォルトで定義されていない限り)非常に稀にあなたが例外をスローココアAPIを見つけません。

あなたはこのコードがあなたを超えて生きるために、その他のCocoaの開発者によって採用されたことが予想される場合は、

、私はエラーが出て使用することをお勧めします。私はココアに慣れていない人々によって構築され、誰が自由例外を使用したコード上で動作し、彼らは回避するには王室の痛みです。

私は、Objective-Cのが使用するタイムアウトエラーのアプローチの大ファンです。あなたは、例外を処理する必要がありますが、あなたがしたい場合は、エラーを無視することを選択することができます。これは、すべての「プログラマは、彼らがやっていることを知っている。」とObjective-Cの態度で収まりますあなたのコードは、のtry-catchブロックで雑然としていないので、それはまた、Objective-Cの非常にきれいに見える言語になります。

言った - あなたが考慮したいと思うかもしれません。例外は無視されているすべてのシナリオがありますか?あなたがの重要の本当に投げる例外はありますか?あなた自身が変数をクリーンアップし、続行簡単なcatchブロックを書いて見つけるのですか?私は唯一の最も重大なエラーのための構文とObjective-C埋蔵例外が好きなので、私が出てエラーに傾くと思います。

これらのチェック例外のようなそのルックスがよりきれいに出てエラーにマップされます。例外は、まだ使用することができますが、例外的な状況のために確保する必要があります。

64ビットのObj-C ABI(ランタイム)がゼロコストの例外を使用していますので、あなたは本当のコストでクリーンなコードを取得すると

例外は、おそらく最良の方法です。もちろん、32ビットに古いのsetjmp / longjmpの例外がまだ使用されているし、それが目標だならば、あなたは問題を抱えているので、彼らは、C ++と相互作用しない。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top