0

私は、try/catch が一般的な方法である Java のバックグラウンドを持っています。

Objective-C を数か月使用した後、iOS アプリに try/catch を実装したことはありません。これは、言語自体の性質と、それを使用しないための一般的なアドバイスのためです。

したがって、私は常にエラーのないコードを作成しようと試みてきました。しかし、この記事を書いている時点では、そのような単純なものをどのように object-c に変換できるかはまだわかりませんでした:

// some operation
try {
  // do some work
} catch (SomethingWentWrongException e) {
  // log error, inform user...etc
}
// some more operation and rest of the code

このコードでは、try/catch 付近の操作が実行されますが、プログラムは壊れておらず、catch 以降の残りのコードが実行されます。

ただし、フロー制御に try catch を使用してはならないというルールがあります。Objective-C と同様のものを実装し、ワークフローを壊すことなく、成功するかどうかに関係なく重要度の低い操作をカプセル化したいと考えています。

Objective-c @try なしでどうすればそれを行うことができますか?

ありがとう

4

2 に答える 2

6

and (および)を使用して、Objective-C でそれを行うことができます。してはいけないという「規則」はありませんが、Cocoaと Cocoa と統合するためのコード ビルド全体に広まっている設計イディオムがあります。例外はプログラマ エラー用に予約されています。つまり、API を使用する人が契約を尊重しない場合、またはメソッドを呼び出すためのいくつかの前提条件を満たさない場合、多くの Objective-C 開発者が例外を使用するのはそのときだけです@try@catch@finally

Objective-C コードでエラーを処理するための一般的なイディオム (たとえば、ファイルがなくなった、必要なリソースを取得できなかったなど) は、Cocoa の NSError クラスを使用して、失敗する可能性のあるメソッドへの参照によってインスタンスを渡すことです。だから、あなたの例を書き直してください:

// some operation
NSError *error;
BOOL itWorked = [object doSomeThingThatCouldFail: &error];
if (!itWorked) {
    // log error, inform user etc.
}
// some more operation and rest of the code

メソッドの戻り値をチェックして、メソッドが成功したか失敗したかを確認することに注意してください。errorオブジェクトは失敗時に設定されることが保証されていますが、成功時に設定される保証はありません。

メソッドの実装がエラーで動作する方法:

- (BOOL)doSomeThingThatCouldFail: (NSError *__autoreleasing*)error {
  //...
  if (!success && error) //check that the user actually supplied an error pointer
  {
    NSDictionary *errorDetails = @{ ... };
    *error = [NSError errorWithDomain: @"Your error domain" code: someInteger userInfo: errorDetails];
  }
  return success;
}
于 2012-08-03T18:39:17.570 に答える
0

ちょっとオフトピックですが、一連のサブ操作の途中で操作を「中止」する必要があるいくつかの状況で私がうまく使用したイディオムは次のとおりです。

int rcode = 0;
do {
    rcode = operationA(xxx);
    if (rcode) break;
    rcode = operationB(xxx);
    if (rcode) break;
    ...
    rcode = operationZ(xxx);
    if (rcode) break;
} while (FALSE);

if (rcode) {
    <do recovery/error-reporting stuff>
}
else {
    <do stuff you'd do if successful>
}

一種の貧乏人の試み/キャッチ-個々の操作の周りにif/then / else全体を持たせようとした場合に、スパゲッティロジックを回避します。(もちろん、オプションで各ステップでいくつかの状態変数を設定して、どこまで到達したか、エラーの理由などを知ることができます。)

于 2012-08-03T19:02:59.410 に答える