2009-12-11 4 views
6

かなり普通のaddPersistentStoreをNSPersistentStoreCoordinatorに行っていて、エラーコード&を生成しました。NSLog、NSError、不正アクセス

だから私はそれをNSLogに行きました、と私はこれをしなかったときに、アクセスエラーを得た:

NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 

共通イディオムであるように思われました。次のように私はエラー文を再フォーマットすると

 NSLog(@"Unresolved error %@", [error userInfo]); 

を...問題は去っていきました。

NSZombieでも不正なアクセスエラーが正しくトラップされませんでした。

アイデア?

答えて

18

どのようにエラーをキャッチしますか?

正しい方法は、described by bbumように、である:

NSError *error; 
BOOL success = [blah blah:blah error:&error]; 
if (!success) { 
    NSLog(@"Error: %@ %@", error, [error userInfo]); //Or other error handling (e.g., [NSApp presentError:error]). 
} else { 
    //Succeeded—ignore the error variable entirely 
} 

(すなわちBOOLを返すメソッドblah:error:ためです;質問bbumの例では、オブジェクトを戻した方法のためだった答えエラー - 。処理パターンはどちらの場合も同じです)

リターンの代わりにエラー変数をテストすると、あなたを欺くことができることを意味するsome APIs will output an error object under the hood even if what you asked for succeededという直後のTwitterのアップデートによると、私はこれがあなたに起こったことだと思います。

解決策は、のみです。 APIがエラーを報告した場合、エラーオブジェクトを調べます。

1

それでも解決しない場合はnilの値

NSError* err = nil; 
[anObject doSomethingGetError:&err]; 
if (err) { 
    NSLog(...); 
} 

でNSErrorを初期化することを忘れないでください、それはAPIが無効であなたの `nil`初期化子を切り詰めた場合に助けにはなりませんAPIのバグ

+1

です(または有効ではあるが無意味な)オブジェクトである。私の答えとそれが引用している@bbumのツイートを見てください。 –

+0

エラーがなければ、APIは "err"参照[これはnil]に触れません。- (NSPersistentStore *)addPersistentStoreWithType:(NSString *)storeType設定:(NSString *)設定URL:(NSURL *)storeURLオプション:(NSDictionary *)オプションエラー:(NSError **)エラー。 このメソッドの戻り値はBOOL型ではありません – vaddieg

+0

実際には、errオブジェクトをnilに設定すると、エラーオブジェクトが発生した場合にerrオブジェクトを調べることになります。 @Peter Hoseyの答えは、メソッド呼び出しが成功したかどうかを判断する正しい方法を示しています。 –

関連する問題