Я использую HessianKit для связи с сервером. В случае отключения сети или сервера Гессиан будет выдавать исключение, поэтому я помещаю каждый вызов Гессиана в блок @try ... @catch. Все работало нормально, пока я не обновил Xcode с 3.2.2 до 3.2.3. Я написал некоторый тестовый код и обнаружил в Xcode 3.2.3, что исключение перехвата не будет выполнено, если исключение было вызвано прокси-объектом.
MyProxy.h:
@interface MyProxy : NSProxy {
}
@end
MyProxy.m:
@implementation MyProxy
- (id)init {
return self;
}
- (void)forwardInvocation:(NSInvocation *)invocation {
NSLog(@"Call method %@", NSStringFromSelector([invocation selector]));
[NSException raise:@"MyException" format:@"this is an exception"];
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
.....
}
@end
Код с использованием MyProxy:
@try {
MyProxy *p = [[MyProxy alloc] init];
[p doSomething];
[p release];
}
@catch (NSException * e) {
NSLog(@"%@", e);
}
Когда эти коды собираются в xcode 3.2.2, исключение может быть правильно перехвачено. Но в xcode 3.2.3 программа прекращает работу после вывода следующего сообщения на консоль:
2010-09-08 21:09:29.877 BriefCase[34651:40b] Call method doSomgthing
2010-09-08 21:09:29.879 BriefCase[34651:40b] *** Terminating app due to uncaught exception 'MyException', reason: 'this is an exception'
2010-09-08 21:09:29.880 BriefCase[34651:40b] Stack: (
45955152,
47113004,
45692683,
45692522,
151932,
45426420,
45423090,
9352,
4417860,
4421967,
4447550,
4429047,
4461016,
53399932,
45234332,
45230248,
4420129,
4453234,
8812,
8666
)
terminate called after throwing an instance of 'NSException'
Program received signal: “SIGABRT”.
Что я могу сделать?