I am using Restkit's object manager to handle a good chunk of my remote API calls.
It throws NSAssert for a wide range of errors. For example, if the server returns a error page as opposed to well-formed JSON, it will raise an NSAssert, even if there is nothing wrong with the code.
There are a few things I am confused about (most of which has to do with general handling of exceptions and nsasserts).
How should we handle these NSAsserts errors? For example, we would want to retry again for a few times, then show a "something went wrong" message (as opposed to crashing the application).
I tried to use a catch-try block to catch the errors (code below), but the errors are not being caught. So my app just keeps failing. Furthermore, I am not comfortable using try-catch in release mode anyway.
Just for my understanding, why do Restkit use NSAsserts, as opposed to other failure?
Code:
// code to catch NSAssert that sharedManager throws
@try{
[sharedManager loadObjectsAtResourcePath:self.resourcePath delegate:self];
}
@catch (NSException *ex) {
NSLog(@"exception caught");
}
In general, you should NOT try to catch NSAssert
errors, as they mean that something went horribly wrong - e.g. an application internal state become inconsistent, your are using library incorrectly etc., - and so application needs to quit.[1]
The reason your errors are not being caught is because NSAssert
raises an NSInternalInconsistencyException
[2], which is a string and not an instance of NSException. You can still catch them as per[3], e.g. with
@catch (id ex)
but it's not recommended for the reasons listed above.
To answer your 3rd question, please provide more details around which NSAssert
is raised etc.