我试图在目标c中实现这样的目标。
@try{
//some code that will raise exception
}
@catch(CustomException e){//How to create this
//catching mechanism
}
@catch(NSException e){
//Generic catch
}
我需要创建CustomException类并使用它。你能帮我创建一下这个CustomException并指导我如何使用它。
提前致谢。
答案 0 :(得分:24)
异常很少用于Objective-C中的控制流程。我猜你有Java(或类似的)背景。
我并不是说你不能写这样的代码,但对于其他看你的代码的人来说会觉得很奇怪,如果你没有完全孤立的话,如果其他人的代码使用它也可能会工作得很糟糕异常,以便它永远不会到达他们的代码。
例外用于严重错误。如果错误是预期的(就像你想要@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;
}
现在,如果错误返回,您可以从您指定的错误代码中识别它是什么类型的错误,您可以在用户信息字典中读取更多详细信息(您可以在其中添加大量信息)。
答案 1 :(得分:12)
在最简单的情况下,我可以使用...
声明一个类@interface CustomException : NSException
@end
@implementation CustomException
@end
...而且代码与您发布的内容非常相似:
@try{
@throw [[CustomException alloc] initWithName:@"Custom" reason:@"Testing" userInfo:nil];
}
@catch(CustomException *ce){
NSLog(@"Caught custom exception");
}
@catch(NSException *e){
NSLog(@"Caught generic exception");
}