为什么使用Try / Catch而不是测试NSError

时间:2012-10-18 09:23:04

标签: objective-c cocoa-touch exception try-catch

有时你会看到一块iOS - Objective-C代码使用Try / Catch结构。

例如来自http://docs.xrtml.org/2-1-0/pubsub/ios/ortcclient.html

的示例
- (void)viewDidLoad
{
    [super viewDidLoad];

    // Instantiate OrtcClient
    ortcClient = [OrtcClient OrtcClientWithConfig:self];

    // Post permissions
    @try {
        NSMutableDictionary* myPermissions = [[NSMutableDictionary alloc] init];

        [myPermissions setObject:@"w" forKey:@"channel1"];
        [myPermissions setObject:@"w" forKey:@"channel2"];
        [myPermissions setObject:@"r" forKey:@"channelread"];

        BOOL result = [ortcClient saveAuthentication:@"http://ortc-developers.realtime.co/server/2.1/" isCLuster:YES authenticationToken:@"myAuthenticationToken" authenticationTokenIsPrivate:NO applicationKey:@"myApplicationKey" timeToLive:1800 privateKey:@"myPrivateKey" permissions:myPermissions];

        if (result) {
            // Permissions correctly posted
        }
        else {
            // Unable to post permissions
        }
    }
    @catch (NSException* exception) {
        // Exception posting permissions
    }

    // Set connection properties
    [ortcClient setConnectionMetadata:@"clientConnMeta"];
    [ortcClient setClusterUrl:@"http://ortc-developers.realtime.co/server/2.1/"];

    // Connect
    [ortcClient connect:@"myApplicationKey" authenticationToken:@"myAuthenticationToken"];
}

为什么要使用这样的结构,你不能只检查saveAuthentication:isCLuster:authenticationToken:...方法的NSError(间接)返回,如'常规'Cocoa-Touch代码吗?例如,在阅读JSON:

NSError *error = nil;
id result = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];

if (error == nil){
    NSLog(@"%@", result);
}else{
    NSLog(@"%@", [error localizedDescription]);
}

2 个答案:

答案 0 :(得分:3)

使用try catch,您可能会遇到无法恢复或可能导致未定义行为的情况,例如 崩溃 ,请使用NSError,其中可恢复的错误需要来自json对象或xml的错误值。

您可以通过Apple documentation 了解异常编程。

答案 1 :(得分:0)

通常,try-catch更加健壮,不需要您定义测试位置的精确位置(可能是块)并提供有关异常的信息。