NSError**问题在多函数调用中传回传播

10 error-handling objective-c nserror ios

面对多功能调用中错误反向传播的问题.

例如,

NSError *error = nil;
EMSPlanFolder *planner = [[EMSPlanFolder sharedPlanBuilder] buildPlanFromParsePlan:plan withError:&error];
if (error) {
   //error
}
Run Code Online (Sandbox Code Playgroud)

接下来,它的功能:

- (EMSPlanFolder*)buildPlanFromParsePlan:(EMParsedPlan*)parsedPlan withError:(NSError *__autoreleasing*)err
{
 ....
 ....
 [self deserializePlan:parsedPlan forPlan:newPlanFolder allowingNoEndDate:NO withError:err];
  if(err && *err) {
   [newPlanFolder.managedObjectContext performBlockAndWait:^{
 [EMSPlanFolder deletePlan:newPlanFolder];
    }];
  return nil;
  }
 return newPlanFolder;
}
Run Code Online (Sandbox Code Playgroud)

接下来,它将:

   - (void)deserializePlan:(NSArray*)planElements forPlan:(LMSPlanFolder*)planFolder allowingNoEndDate:(BOOL)allowNoEndDate withError:(NSError *__autoreleasing*)err {
     ....
     ....
     if(err) {
      *err = [NSError errorWithDomain:@"Application" code:-1 userInfo:@{ NSLocalizedDescriptionKey:[NSString stringWithFormat:@"Plan was not found."]}];
     }
     return;
    }
Run Code Online (Sandbox Code Playgroud)

问题是,当它返回传播到第一个代码片段时会导致崩溃.有任何建议

小智 0

尝试这个:

NSError *error = nil;
EMSPlanFolder *planner = [[EMSPlanFolder sharedPlanBuilder] buildPlanFromParsePlan:plan withError:&error];
if (error) {
   //error
}

- (EMSPlanFolder*)buildPlanFromParsePlan:(EMParsedPlan*)parsedPlan withError:(NSError **)err
{
 ....
 ....
 [self deserializePlan:parsedPlan forPlan:newPlanFolder allowingNoEndDate:NO withError:&err];
  if(err == nil) {
   [newPlanFolder.managedObjectContext performBlockAndWait:^{
 [EMSPlanFolder deletePlan:newPlanFolder];
    }];
  return nil;
  }
 return newPlanFolder;
}

- (void)deserializePlan:(NSArray*)planElements forPlan:(LMSPlanFolder*)planFolder allowingNoEndDate:(BOOL)allowNoEndDate withError:(NSError **)err {
     ....
     ....
     if(err) {
      *err = [NSError errorWithDomain:@"Application" code:-1 userInfo:@{ NSLocalizedDescriptionKey:[NSString stringWithFormat:@"Plan was not found."]}];
     }
     return;
}
Run Code Online (Sandbox Code Playgroud)