2013-10-07 3 views
6

У меня есть следующий код. , ,бросать обычай исключение в объекте c

@try 
{ 
    NSArray * array = [[NSArray alloc] initWithObjects:@"1",@"2",nil]; 

    // the below code will raise an exception 

    [array objectAtIndex:11]; 
} 
@catch(NSException *exception) 
{ 
    // now i want to create a custom exception and throw it . 

    NSException * myexception = [[NSException alloc] initWithName:exception.name 
                  reason:exception.reason 
                 userInfo:exception.userInfo]; 


    //now i am saving callStacksymbols to a mutable array and adding some objects 

    NSMUtableArray * mutableArray = [[NSMUtableArray alloc] 
             initWithArray:exception.callStackSymbols]; 

    [mutableArray addObject:@"object"]; 

    //but my problem is when i try to assign this mutable array to myexception i am getting following error 

    myexception.callStackSymbols = (NSArray *)mutableArray; 

    //error : no setter method 'setCallStackSymbols' for assignment to property 

    @throw myexception; 

} 

, пожалуйста, помогите исправить это, я хотел добавить дополнительные объекты в callStackSymbols. , , . Заранее спасибо

+2

Не пытайтесь восстанавливаться из-за исключения. Исключения в iOS и OS X следует рассматривать как неустранимые, фатальные, ошибки программиста. – bbum

ответ

2

Если вы исходите из фона Java, обработка исключений в Objective-C сначала кажется странной. Фактически вы обычно не используете NSException для вашей собственной обработки ошибок. Вместо этого используйте NSError, так как вы можете найти его во многих других точках через SDK при обработке непредвиденных ситуаций с ошибками (например, операций URL).

Обработка ошибок выполняется (примерно), как это:

Написать метод, который принимает указатель на NSError в качестве параметра ...

- (void)doSomethingThatMayCauseAnError:(NSError*__autoreleasing *)anError 
{ 
    // ... 
    // Failure situation 
    NSDictionary tUserInfo = @{@"myCustomObject":@"customErrorInfo"}; 
    NSError* tError = [[NSError alloc] initWithDomain:@"MyDomain" code:123 userInfo:tUserInfo]; 
    anError = tError; 
} 

Словарь USERINFO это место, чтобы положить все информационные потребности для обеспечения ошибки.

При вызове метода, вы проверяете для ситуации ошибки, как это ...

// ... 
NSError* tError = nil; 
[self doSomethingThatMayCauseAnError:&tError]; 
if (tError) { 
    // Error occurred! 
    NSString* tCustomErrorObject = [tError.userInfo valueForKey:@"myCustomObject"]; 
    // ... 
} 

Если вы вызываете метод SDK, который может привести в «NSError != nil», вы можете добавить свою собственную информацию словарь userInfo и передать эту ошибку вызывающему абоненту, как показано выше.

+0

NSError - не исключение. Я чувствую, что в java не указано достаточно ясно –