在cocoa中try / catch内部的错误传播

时间:2012-08-07 13:17:35

标签: objective-c cocoa exception exception-handling try-catch

我想在方法的catch块中引发异常,并在调用早期方法的另一个方法的catch中处理它。 我试过这个逻辑 -

method B()
{
    @try{
        .......
        // calling method where is probable chance of exception


    method A();
    }
    catch(NSException e)
    {
        //catching the exception thrown in the method B()
        NSString* theError=[e reason];
        NSLog(@"the error is == %@",theError);
    }
}

method A()
{
    @try{
        .............
        //throw an exception incase of some condition
        throw e;
    }
    catch(NSException e)
    {
        //rethrowing the exception, want to catch in the method from where this method is called.  
        throw e;
    }
}

但方法B()的catch块永远不可访问。 控件永远不会返回到方法B()的catch块。 请建议。

谢谢,     Sudhansu


这是一些代码。我从MyController调用TableController的方法(populateData)。 应该发生在TableController(initializeTest)的另一个方法中的异常,我抛出它 在FinderCompleted方法的try块中。在同一方法的catch块中,重新抛出异常,如 我不想在这里处理它。 控件仅限于方法的最里面的catch块 - (void)FinderCompleted:(id)args NSLog打印像这样 - 我在这里1 里面的错误 你的桶里什么都没有:D 第一次投掷例外 Gotcha - 第一次例外,第二次投掷它 错误是==意外发生了什么--EXCEPTION

之后我不知道控制在哪里。我希望控件去调用调用FinderCompleted方法的外部方法的块, 并打印其他日志,如 - Gotcha - 第2次例外,第3次投掷 Gotcha - 第三次例外 第四次抛出异常 Gotcha - 第四次例外 错误是意外发生了--EXCEPTION


in MyController.m

- (IBAction)fetchResults:(id)sender
{
    NSArray *tableColumnArray = ...............;//some values initialized
    NSArray *identifierArray = ................;//some values initialized
    NSArray *bindVariableArray = ................;//some values initialized
    TableController *pTC = [[TableController alloc] init];
    @try
    {
        [pTC populateData :tableColumnArray :identifierArray :bindVariableArray];// calling populate DataForMD method defined in  TableController class
        [pTC release];
    }
    @catch (NSException * e)
    {
        NSLog(@"Gotcha--4th time exception");
        //want to handle the exception here 
        NSString* theError=[e reason];
        NSLog(@"the error is %@",theError);
    }
}

TableController.m中的

-(void)populateData:(NSArray *)tableColumnArray:(NSArray *)identifierArray:(NSArray *)bindVariableArray
{
    [self setTableColumnArray:tableColumnArray];
    [self setColumnIdentifierArray:identifierArray];
    [self setBindVarArray:bindVariableArray];
    @try
    {
        NSLog(@"m here 1");
        [self initializeTest];// calling initializeTest method 
    }
    @catch (NSException * e)
    {
        //Do not want to handle it here 
        NSLog(@"Gotcha--3rd time exception");
        NSLog(@"Throwing exception for the 4th time");
        @throw e;
    }
}

-(void)initializeTest
{
    @try
    {
        ISTQuery* theQuery = (ISTQuery*)[ISTQueryGenerator getQueryByName:[self queryClassName]];
        ..........
        ...........//some loc here
        [theQuery run];
        .................//some loc here
        if(theQuery)
        {
            //Calling FinderCompleted method 
            //supposed to get error here
            [[self modelFinder] startWithRecipient:self andNotificationSelector:@selector(FinderCompleted:)];
        }
    }
    @catch(NSException *e) 
    {
        NSLog(@"Gotcha--2st time exception, throwing it 3rd time");
        //Do not want to handle it here 
        @throw e; // rethrows e implicitly
    }
}

- (void)FinderCompleted:(id)args
{
    @try
    {   //getting some error while back-end transaction 
        NSString* theError = [ISTModelFinder errorMessageFromFinderArgs:args];
        if (theError)
        {
            NSLog(@"Inside the error");
            NSLog(@"You got nothing in ur bucket :D");
            NSException *e = [NSException
                              exceptionWithName:@"InternalErrorException"
                              reason:@"Something unexpected happened --EXCEPTION"
                              userInfo:nil];
            NSLog(@"Throwing exception for the 1st time");
            @throw e;
        }       
        else
        {
            //do sth else
        }
    }   
    @catch(NSException *e) 
    {
        NSLog(@"Gotcha--1st time exception , throwing it 2nd time");
        NSString* theError=[e reason];
        //Do not want to handle it here 
        NSLog(@"the error is == %@",theError);
        @throw e; // rethrows e implicitly
    }
}   

1 个答案:

答案 0 :(得分:1)

您不能在Cocoa或iOS编程中使用流控制的异常。例外情况纯粹是为了识别不可恢复的错误,通常,程序很快就会有目的地崩溃。 (除了这个规则的一些例外,其中大多数都有针对它们的错误,以弃用并删除相关的API。)

使用NSError模式管理用户可恢复的错误。

目前尚不清楚您的代码无法正常工作。但这看起来不像真正的代码。你有什么尝试?


  

我添加了代码段,请建议如何实现   功能。

您要做的第一件事是不要使用例外

使用NSError模式。您需要重构代码才能这样做。这是值得的。

请参阅error handling in cocoa上的文档。