NSError: passing error in method
-
14-07-2021 - |
質問
I'm not sure if this is correct or not:
- (void)parseSomething:(id)targetObject error:(NSError **)error {
NSError *parserError = nil;
[myParser parse:targetObject error:&parserError];
if (parserError != nil) {
*error = parserError;
}
}
the line:
*error = parserError;
I set error in parameter to be a local error, is it done correctly?
or should I do:
error = &parserError;
instead?
解決
You need to make sure error
isn't nil before you try to dereference it. Also, there is no need for the local NSError. It'd write that code this way:
- (void)parseSomething:(id)targetObject error:(NSError **)error {
[myParser parse:targetObject error:error];
}
But if you really wanted the locale variable (or for demonstration purposes). then this:
- (void)parseSomething:(id)targetObject error:(NSError **)error {
NSError *parserError = nil;
[myParser parse:targetObject error:&parserError];
if (error && parserError) {
*error = parserError;
}
}
Also, most methods that have an NSError
out parameter like this usually have a BOOL return value or some other return value to indicate success or not. You shouldn't rely in the error parameter to indicate whether there was an error or not.
- (BOOL)parseSomething:(id)targetObject error:(NSError **)error {
NSError *parserError = nil;
BOOL ok = [myParser parse:targetObject error:&parserError];
if (error && parserError) {
*error = parserError;
}
return ok;
}
他のヒント
In this case you would probably want to pass the error further without intermediate variables. However, you need to be sure the myParser
object handles the error parameter properly.
- (void)parseSomething:(id)targetObject error:(NSError **)error
{
[myParser parse:targetObject error:error];
}
In case you want to handle it here, you need to make sure the pointer to pointer error
points to something, otherwise you will have crash when dereferencing it.
For example: the method was called like this
[object parseSomething:targetObject error:NULL];
The following line leads to crash:
*error = parserError;
Correct code would look like this:
- (void)parseSomething:(id)targetObject error:(NSError**)error
{
NSError* parserError = nil;
[myParser parse:targetObject error:&parserError];
if (error != nil)
{
*error = parserError;
}
}
Not a problem when parserError
is nil, but when error
is nil.