6

我正在尝试在目标 c 中实现类似的目标。

@try{
//some code that will raise exception
}
@catch(CustomException e){//How to create this
//catching mechanism
}
@catch(NSException e){
//Generic catch
}

我需要创建 CustomException 类并使用它。您能否帮助我创建此 CustomException 并指导我如何使用它。

提前致谢。

4

2 回答 2

27

在 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;
}

现在,如果错误返回,您可以从您指定的错误代码中识别出哪种错误,您可以在用户信息字典中阅读更详细的信息(您可以在其中添加大量信息)。

于 2012-07-15T15:51:57.983 回答
13

在最简单的情况下,我可以使用...声明一个类

@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");
    }
于 2012-07-15T15:51:46.343 回答