在 Objective-C 中,异常很少用于像这样的控制流。我猜你有 Java(或类似)背景。
我并不是说你不能编写这样的代码,但是如果你不完全隔离代码,其他人看到你的代码会觉得很奇怪,如果被其他人的代码使用也可能会很糟糕异常,使其永远不会到达他们的代码。
在 Objective-C 中通常是如何完成的
异常用于严重错误。如果错误是预期的(好像是因为你想@try 它)你应该尝试返回一个NSError。这是一种在 Foundation 和 Cocoa 框架以及第三方框架中都使用的设计模式。例如查看网络、文件读/写或 JSON 代码 (JSONObjectWithData:options:error:)
你会做什么
您所做的是在您的方法末尾添加一个可能失败的错误参数(双指针),如下所示:
- (MyResultObject *)myMethodThatCouldFailWith:(MyObject *)myObject
error:(NSError **)error;
当某人(你或其他人)使用此方法时,如果他们想传递一个 NSError 指针,如果发生错误,他们可以设置该指针,如下所示:
NSError *error = nil; // Assume no error
MyResultObject *result = [self myMethodThatCouldFailWith:myObject
error:&error];
if (!result) {
// An error occurred, you can check the error object for more information.
}
注意错误参数前的与号 (&)。这意味着您将错误点作为参数发送,以便在有风险的方法中,可以将指针更改为指向新的NSError 对象,该对象可以在方法返回后读取。
现在,在您可能失败的方法中,如果出现问题(而不是引发异常),您可以将错误设置为新的 NSError 对象。发生错误时返回nil 也很常见,因为这可能意味着计算无法完成或数据不可靠或不相关。
- (MyResultObject *)myMethodThatCouldFailWith:(MyObject *)myObject
error:(NSError **)error {
// Do something "risky" ...
MyResultObject *result = [MyResultObject somethingRiskyWith:myObject];
// Determine if things went wrong
if (!result) {
// Set error if a pointer for the error was given
if (error != NULL) {
*error = [NSError errorWithDomain:yourErrorDomain
code:yourErrorCode
userInfo:optionalDictionaryOfExtraInfo];
}
return nil;
}
// Everything went fine.
return result;
}
现在,如果错误返回,您可以从您指定的错误代码中识别错误类型,并且您可以在用户信息字典中阅读更详细的信息(您可以在其中添加大量信息)。