2

对于那些学习 Objective-C 的人来说,计算器课似乎是一个流行的起点。所以在我的“计算器”类中,我定义了我的加法函数以使用“decimalNumberByAdding:withBehavior:”方法。'_behavior' 在 init 方法中定义。描述的代码如下所示:

-(id)init
{
    if ((self = [super init]))
    {
        // Yes, raise errors (or exceptions) 
        // on all of these cases, 
        // and control the scale (number precision).
        _behavior = [NSDecimalNumberHandler 
                    decimalNumberHandlerWithRoundingMode:NSRoundPlain 
                    scale:NSDecimalNoScale 
                    raiseOnExactness:YES 
                    raiseOnOverflow:YES 
                    raiseOnUnderflow:YES 
                    raiseOnDivideByZero:YES];
    }
    return self;
}

// My addition method
-(NSDecimalNumber *)addNum1:(NSDecimalNumber *)num1 
                    andNum2:(NSDecimalNumber *)num2
{
    NSDecimalNumber *result = [num1 decimalNumberByAdding:num2
                                    withBehavior:_behavior];
    return result;
}

要正确使用 NSDecimalNumberBehaviors 协议,需要实现 3 个方法:'-roundingMode'、'-scale' 和 '-exceptionDuringOperation:error:leftOperand:rightOperand:'(但是,上面的 NSDecimalNumberHandler 中没有指定 roundingMode 和 scale,称为'_行为'?)。

使用此协议的动机是如果出现“_behavior”中定义的错误之一(例如溢出或精度丢失错误),则引发并处理异常。

在搜索网络和 Apple 的文档后,尚不清楚如何使用 NSDecimalNumberBehaviors 协议,以及如何正确引发和处理上面“_behavior”中描述的错误(与“_behavior”相比,协议实现似乎包括冗余' 宣言)。

使用 NSDecimalNumberBehaviors 协议并引发和处理“_behavior”中定义的错误的正确方法是什么?也许一个例子最有帮助。谢谢 : )

- 更新:

再次查看文档后,我现在看到 NSDecimalNumberHandler 采用了 NSDecimalNumberBehaviors 协议。所以这意味着我只需要正确初始化和使用 NSDecimalNumberHandler 。

添加除法方法后(为了测试除以 0 异常),我看到代码看起来更像这样:

-(id)init
{
    if ((self = [super init]))
    {
    // Yes, raise errors (or exceptions) 
        // on all of these cases, 
        // and control the scale (number precision).
        _behavior = [NSDecimalNumberHandler alloc] 
                    initWithRoundingMode:NSRoundPlain
                    scale:NSDecimalNoScale 
                    raiseOnExactness:YES 
                    raiseOnOverflow:YES 
                    raiseOnUnderflow:YES 
                    raiseOnDivideByZero:YES];
    }
    return self;
}

// My division method
-(NSDecimalNumber *)divideNum1:(NSDecimalNumber *)num1 byNum2:(NSDecimalNumber *)num2
{
    NSDecimalNumber *result = [num1 decimalNumberByDividingBy:num2
                                    withBehavior:_behavior];
    return result;
}

实际上,除以 0 会引发未捕获的异常并终止程序。好的,这样更好。我如何捕获抛出的异常,以及在语法上,在哪里?

4

1 回答 1

0

使用@try, @catchObjC 文字。将您的除法代码包装在@try块中,并在块中捕获捕获的异常@catch

于 2012-06-06T15:34:40.930 回答