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 returnnil
(Edit: and anNSError**
) 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.