如何在目标c中创建自定义异常?

Eas*_*y K 6 iphone macos objective-c ios

我试图在目标c中实现这样的目标.

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

我需要创建CustomException类并使用它.你能帮我创建一下这个CustomException并指导我如何使用它.

提前致谢.

Dav*_*ist 25

在Objective-C中,异常很少用于控制流程.我猜你有Java(或类似)背景.

我并不是说你不能写这样的代码,但对于其他看你的代码的人来说会觉得很奇怪,如果你没有完全隔离异常,那么如果其他人的代码使用它也可能会很糟糕它从未达到过他们的代码.

如何在Objective-C中完成

例外用于严重错误.如果错误是预期的(就像你想要的那样@try),你应该尝试返回一个NSError.这是一个在Foundation和Cocoa框架以及第三方框架中使用的设计模式.查看网络,文件读/写或JSON代码(JSONObjectWithData:options:error:)的示例

你会做什么

你要做的是在方法的末尾添加一个错误参数(双指针),可能会失败,如下所示:

- (MyResultObject *)myMethodThatCouldFailWith:(MyObject *)myObject
                                        error:(NSError **)error;
Run Code Online (Sandbox Code Playgroud)

当某人(您或其他人)使用此方法时,如果他们想要传递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.
}
Run Code Online (Sandbox Code Playgroud)

请注意&error参数之前的ampersand().这意味着您将错误点作为参数发送,以便在危险方法内部可以将指针更改为指向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;
}
Run Code Online (Sandbox Code Playgroud)

现在,如果错误返回,您可以从您指定的错误代码中识别它是什么类型的错误,您可以在用户信息字典中读取更多详细信息(您可以在其中添加大量信息).


Phi*_*lls 12

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

@interface CustomException : NSException
@end
@implementation CustomException
@end
Run Code Online (Sandbox Code Playgroud)

...而且代码与您发布的内容非常相似:

   @try{
        @throw [[CustomException alloc] initWithName:@"Custom" reason:@"Testing" userInfo:nil];
    }
    @catch(CustomException *ce){
        NSLog(@"Caught custom exception");
    }
    @catch(NSException *e){
        NSLog(@"Caught generic exception");
    }
Run Code Online (Sandbox Code Playgroud)