メソッドの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
}
}