• 周日. 11月 27th, 2022

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

NSError错误类的使用

admin

11月 28, 2021

学会2个方面的内容,基本就可以上手NSError:

1、NSError对象的创建和解读

2、NSError对象的传递方式,通过委托方法回调方式、通过以NSerror对象指针的指针作为参数的方式

一、NSError的创建和解读

- (void)test {
    // 代码一
    NSString *desc1 = NSLocalizedString(@"FileNotFound", @"");
    NSDictionary *info1 = @{NSLocalizedDescriptionKey : desc1};
    NSError *error1 = [NSError errorWithDomain:NSCocoaErrorDomain code:NSFileNoSuchFileError userInfo:info1];
    NSLog(@"error1:%@", error1);
    
    // 代码二
    NSString *desc2 = @"FileNotFound";
    NSDictionary *info2 = @{@"NSiOSKey" : desc2};
    NSError *error2 = [NSError errorWithDomain:@"iOSDomain" code:8888 userInfo:info2];
    NSLog(@"error2:%@", error2);
    
    // 代码三
    NSString *desc3 = @"FileNotFound";
    NSDictionary *info3 = @{NSLocalizedDescriptionKey : desc3};
    NSError *error3 = [NSError errorWithDomain:@"iOSDomain" code:8888 userInfo:info3];
    NSLog(@"error3:%@", error3);
    
    // 代码四
    NSString *desc4 = NSLocalizedString(@"FileNotFound", @"");
    /*
     NSLocalizedDescriptionKey、NSLocalizedFailureReasonErrorKey 等?
     */
    NSDictionary *info4 = @{NSLocalizedDescriptionKey : desc4};
    NSError *error4 = [NSError errorWithDomain:@"3CWDomain" code:111 userInfo:info4];
    NSLog(@"error4:%@", error4);
    
    // 代码五
    NSString *description = [error4 localizedDescription];
    NSString *domian = [error4 domain];
    NSInteger code = [error4 code];
    NSDictionary *infoDic = [error4 userInfo];
    NSString *descMesssage = [infoDic objectForKey:NSLocalizedDescriptionKey];
    NSLog(@"description:%@  domian:%@  code:%ld  descMesssage:%@", description, domian, code, descMesssage);

}

打印的结果:

2021-08-05 13:31:38.549182+0800 OCTestLine[10570:258023] error1:Error Domain=NSCocoaErrorDomain Code=4 "FileNotFound" UserInfo={NSLocalizedDescription=FileNotFound}
2021-08-05 13:31:38.549253+0800 OCTestLine[10570:258023] error2:Error Domain=iOSDomain Code=8888 "(null)" UserInfo={NSiOSKey=FileNotFound}
2021-08-05 13:31:38.549288+0800 OCTestLine[10570:258023] error3:Error Domain=iOSDomain Code=8888 "FileNotFound" UserInfo={NSLocalizedDescription=FileNotFound}
2021-08-05 13:31:38.549333+0800 OCTestLine[10570:258023] error4:Error Domain=3CWDomain Code=111 "FileNotFound" UserInfo={NSLocalizedDescription=FileNotFound}
2021-08-05 13:31:38.549358+0800 OCTestLine[10570:258023] description:FileNotFound  domian:3CWDomain  code:111  descMesssage:FileNotFound
Program ended with exit code: 0

参数说明:

Code码可以自定义;

Domain指的是错误域,有4中主要的错误域,当然也可以自定义错误域;

UserInfo是NSDictionary实例,指的是用户信息字典,含有的信息类型包括错误的本地化信息和对支持对象的引用。

 二、NSError的传递方式

一种方式就是通过委托方法,因为“委托者”会弱引用“委托对象”,即(weak)delegate。委托对象所指向的类会声明和定义“委托方法”,在需要的情况下,委托者会调用委托对象中的委托方法,故正在此时,将错误对象作为委托方法的参数,便传递给了“委托对象”。

第二种方式,是一种常见的OC编程惯例,将方法的最后一个参数设置为指向错误对象指针的指针(也称为双重间接模式)。通过这种方式可以使被调用的方法修改错误对象的指针,而且当出现错误时,返回与方法调用操作对应的错误对象。

- (void)test {

    NSError *error;
    BOOL success = [self changeValue:&error];
    if (!success) {
        NSLog(@"error:%@", error);
    }
}

- (BOOL)changeValue:(NSError **)error {
    
    NSString *desc = NSLocalizedString(@"FileNotFound", @"");
    NSDictionary *info = @{NSLocalizedDescriptionKey : desc};
    *error = [NSError errorWithDomain:NSCocoaErrorDomain code:NSFileNoSuchFileError userInfo:info];
    return NO;
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注