我已经创建了NSException类的子类来创建CustomException类。
每当我在代码中捕获异常(在@catch中)时,我想用NSException的对象初始化一个CustomException对象(NSException的子类),该对象作为参数传递给@catch。
像这样的东西
@catch (NSException * e) {
CustomException * ex1=[[CustomException alloc]initWithException:e errorCode:@"-11011" severity:1];
}
我试过将NSException对象传递给CustomException的init方法。 (我将[super init]替换为传递的NSException对象,如下所示)
//initializer for CustomException
-(id) initWithException:(id)originalException errorCode: (NSString *)errorCode severity:(NSInteger)errorSeverity{
//self = [super initWithName: name reason:@"" userInfo:nil];
self=originalException;
self.code=errorCode;
self.severity=errorSeverity;
return self;
}
这不起作用!我怎样才能做到这一点?
提前致谢
答案 0 :(得分:0)
self = originalException;
当你这样做时,你只需要为NSException
分配一个NSCustomException
对象
以下事情将会发生:
执行此操作时可能会收到警告
从那以后的任务
预计会CustomException
,但是你
正在通过NSException
对象;(
之后,编译器会认为self
是一个CustomException
对象所以它
在打电话时不会抱怨
CustomException
类的方法
但到达时会崩溃
那些。
您应该启用initWithName:reason:userinfo:
并且不要执行任务。
答案 1 :(得分:0)
您正在尝试执行某些通常[*]在任何OO语言中都不受支持的操作 - 将类的实例转换为其子类之一的实例。
您的作业self=originalException
只是(类型不正确)指针赋值(编译器和运行时将不检查,因为您使用id
作为类型) - 这不会CustomException
中的NSException
。
要实现您想要的内容,请使用
替换self=originalException
[super initWithName:[originalException name]
reason:[originalException reason]
userInfo:[originalException userInfo]]
然后继续初始化您在CustomException
中添加的字段。
[*]在Objective-C中, 在某些情况下可以正确地将类实例转换为子类实例,但是不要这样做非常好的理由。如果你不知道你怎么也不应该想到它; - )