KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
As I understand, the use of @try/@catch blocks is discouraged, because exceptions should only be thrown at unrecoverable, catastrophic errors (refer to this discussion with a nice answer by @bbum : Exception Handeling in iOS ). So I looked through my code and found a @try/@catch block that I don't know how to get rid of: NSData *fileData = [NSData dataWithContentsOfFile: ....]; NSDictionary *dictionary; @try { dictionary = [NSKeyedUnarchiver unarchiveObjectWithData: fileData]; } @catch (NSException *exception) { //.... } @finally { //... } The problem is that (as stated in the documentation ) +unarchiveObjectWithData: raises an NSInvalidArchiveOperationException if the NSData doesn't contain a valid archive. Since the data is provided by a file the user chose, it is not guaranteed that it contains a valid archive, and thus the application would crash if a incorrect file was chosen. Now two questions: Why doesnt +unarchiveObjectWithData: just return nil ( Edit: and an NSError** ) if the archive is not valid (this doesn't seem to qualify as a catastrophic or unrecoverable error). Is the pattern above correct (using @try )? I have found no method that lets us check if the data contains a valid archive beforehand and have found no possibility to handle this case using the delegate protocol. Antyhing I overlooked? Note that the code above of course works, I just wonder if its the best practice.<
Tags (comma-separated)
Save Edits
Cancel