2012-06-06 5 views
2

Класс калькулятора, по-видимому, является популярной отправной точкой для обучения Objective-C. Поэтому в моем классе «calculator» я определил свою функцию добавления, чтобы использовать метод decimalNumberByAdding: withBehavior:. «_behavior» определяется в методе init. Код описано показан ниже:Objective - C, используя NSDecimalNumberHandler и NSDecimalNumberBehaviors protocol

-(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', '- масштаб' и '- exceptionDuringOperation: Ошибка: leftOperand: rightOperand:' (Тем не менее, это не roundingMode и масштаб, уже указанный в моем NSDecimalNumberHandler выше, называемый «_behavior»?).

Мотивация использования этого протокола заключается в том, чтобы поднять и обработать исключение, если произошла одна из ошибок, как определено в «_behavior» (например, переполнение или потеря точности ошибки).

После поиска в Интернете и документации Apple пока не ясно, как использовать протокол NSDecimalNumberBehaviors, и правильно поднимать и обрабатывать ошибки, описанные выше в «_behavior» (реализация протокола, по-видимому, включает в себя избыточность при сравнении с объявлением '_behavior').

Каков правильный способ использования протокола NSDecimalNumberBehaviors и поднять и обработать ошибки, определенные в «_behavior»? Возможно, пример поможет большинству. Спасибо:)

--update:

После снова глядя на документацию, я теперь вижу, что 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 бросает неперехваченное исключение и завершает программу. Хорошо, это лучше. Как я могу поймать заброшенное исключение и синтаксически, где?

+0

RTFM .. http://www.gnustep.org/resources/documentation/Developer/Base/ProgrammingManual/manual_6.html – Jay

ответ

0

@try, @catch ObjC литералы. Оберните свой код деления в @try блоком и поймайте пойманное исключение в блоке @catch.