2011-06-18 9 views
5

リモートのapi呼び出しの問題を解決するために、Restkitのオブジェクトマネージャを使用しています。Restkit throwsでNSAssertsを処理する

NSAssertが広範囲のエラーをスローします。たとえば、正常に作成されたjsonとは対照的に、サーバーがエラーページを返した場合、コードに何も問題がない場合でも、NSAssertが生成されます。

  1. がどのように我々はこれらのNSAssertsエラーを処理する必要があります(例外とnsassertsの一般的な取扱いに関係しているほとんどが)私は混乱していますがいくつかありますか?たとえば、何度か再試行してから、「何かが間違っている」というメッセージを表示したいとします。

  2. 私はcatch-tryブロックを使用してエラー(以下のコード)をキャッチしようとしましたが、エラーはキャッチされません。だから私のアプリはちょうど失敗し続けます。さらに、私はとにかくリリースモードでtry-catchを使うのは快適ではない。感謝 - 他の障害とは対照的に、ちょうど私の理解のため

  3. 、なぜあなたの助けのための

おかげで多くは、Restkit使用NSAssertsを行います!一般的に

// code to catch NSAssert that sharedManager throws 
@try{ 
    [sharedManager loadObjectsAtResourcePath:self.resourcePath delegate:self]; 
} 

@catch (NSException *ex) { 
    NSLog(@"exception caught"); 
} 
+0

IME、人々は(私自身を含む)アサーションを使用するのは簡単です。エラー処理がうまくいかないからです。サーバーがガベージを返したため、プロダクションコードが失敗したアサーションを持つべきではありません。ライブラリコード*本当に*してはいけません。あなたは '#define NS_BLOCK_ASSERTIONS 1'を試して、何が起こるか見ることができます... –

答えて

3

彼らは何かが恐ろしく間違っていたことを意味するものとして、あなたはは、NSAssertエラーをキャッチすべきではない - 例えばアプリケーションの内部状態が矛盾し、ライブラリを間違って使用しているなど - アプリケーションを終了する必要があります。

NSAssert文字列ないNSExceptionのインスタンスである、[2] NSInternalInconsistencyExceptionを上げるために、あなたのエラーがキャッチされていない理由があります。あなたは[3]のようにそれらを捕まえることができます。

@catch (id ex) 

ですが、上記の理由ではお勧めしません。

あなたの第三の質問に答えるために、NSAssertを上げて、その周りの詳細を提供してくださいなど

[1] What's the point of NSAssert, actually?

[2] http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html#//apple_ref/c/macro/NSAssert

[3] http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Exceptions/Tasks/HandlingExceptions.html

関連する問題