gpt4 book ai didi

objective-c - cocoa 中 try/catch 内部的错误传播

转载 作者:行者123 更新时间:2023-12-03 17:56:54 28 4
gpt4 key购买 nike

我想在方法的 catch block 内引发异常,并在调用较早方法的另一个方法的 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 block 永远无法访问。控制永远不会返回到方法 B() 的 catch block 。请提出建议。

谢谢, 苏丹苏

<小时/>

这里有一些代码。我正在从 MyController 调用 TableController 的方法(populateData)。异常应该发生在 TableController(initializeTest) 的另一个方法中,我抛出它在 FinderCompleted 方法的 try block 内。在同一方法的 catch block 中,重新抛出异常,如下我不想在这里处理它。控制仅限于方法的最里面的 catch block - (void)FinderCompleted:(id)argsNSLog 打印如下 -我在这里 1错误里面你的桶里什么也没有:D第一次抛出异常陷阱--第一次异常,第二次抛出它错误是==发生了意外的事情--EXCEPTION

之后我不知道控件去了哪里。我希望控件去捕获调用 FinderCompleted 方法的外部方法的 block ,并打印其他日志,例如-陷阱——第二次异常,第三次抛出它陷阱——第三次异常第四次抛出异常陷阱——第四次异常错误是发生了意外的事情 --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
}
}

最佳答案

您不能在 Cocoa 或 iOS 编程中使用异常进行流程控制。异常纯粹是为了识别不可恢复的错误,通常,程序会在不久之后故意崩溃。 (此规则有少数异常(exception),其中大多数都有针对它们提交的错误,以弃用并消除相关 API。)

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

目前尚不清楚您的代码为何无法运行。但这看起来不像真正的代码。你尝试过什么?

<小时/>

I had added the code snippet, please suggest how to achieve that functionality.

您要做的第一件事是不要使用异常

使用 NSError 模式。为此,您需要重构代码。这是值得的。

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

关于objective-c - cocoa 中 try/catch 内部的错误传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11846899/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com