0

メソッドの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)argsNSLogは次のように出力します-mhere 1エラーの内部urバケットに何もありません:D初めて例外をスローしますGotcha- -1回目の例外、2回目のエラーのスロー==予期しないことが発生しました--EXCEPTION

その後、コントロールがどこに行くのかわかりません。コントロールがFinderCompletedメソッドを呼び出す外部メソッドのブロックをキャッチし、他のログを出力するようにします-Gotcha--2回目の例外、3回目のGotcha--3回目の例外4回目のGotchaのスロー例外-- 4回目の例外エラーは予期しないことが発生しました--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
    }
}   
4

1 に答える 1