【问题标题】:How to create custom exception in objective c?如何在目标 c 中创建自定义异常?
【发布时间】:2012-07-15 15:30:56
【问题描述】:

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

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

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

提前致谢。

【问题讨论】:

    标签: iphone objective-c ios macos


    【解决方案1】:

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

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

    【讨论】:

    • 为尊重 Java 点赞。
    【解决方案2】:

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

    @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");
        }
    

    【讨论】:

    • 谢谢菲利普。在java中,我们可以在Exception本身的子类中给出错误信息。我们可以在这里做吗?只是将其与 java 进行比较。你能解释一下吗?
    • 我想到了两种可能性:init 方法中的 reason 是一个可以引用、显示、比较的字符串......定义您需要的任何它自己的属性或方法。
    • 按照 Apple 的建议使用 NSErrors。您可以在 UserInfo 字典中包含自定义消息。
    猜你喜欢
    • 2011-11-18
    • 2017-06-04
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2011-04-26
    相关资源
    最近更新 更多