2011-02-02 28 views
1

我已經創建了子類NSException類來創建CustomException類。如何使用「超類的現有對象」初始化子類的對象目標C

每當我在代碼中捕獲異常(@catch)時,我想用作爲參數傳遞給@catch的NSException對象初始化CustomException(NSException的子類)對象。

像這樣的事情

@catch (NSException * e) { 

CustomException * ex1=[[CustomException alloc]initWithException:e errorCode:@"-11011" severity:1]; 
} 

我試圖通過傳遞NSException對象CustomException的init方法做這件事。 (我取代了[超級的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; 
} 

這doen't工作!我怎樣才能做到這一點?

在此先感謝

回答

0

你正在嘗試做一些通常[*]在任何OO語言中都不被支持的東西 - 將一個類的實例轉換成它的一個子類的一個實例。

你的任務self=originalException只是(類型不正確的)指針賦值(編譯器和運行時會檢查爲你使用id作爲類型) - 這不會讓CustomExceptionNSException的。

達到你想要與

[super initWithName:[originalException name] 
     reason:[originalException reason] 
     userInfo:[originalException userInfo]] 

更換self=originalException什麼,然後繼續初始化你CustomException已添加的字段。


[*]在Objective-C是是在某些情況下,一個類的實例正確地轉換成一個子類的實例可能的,但不這樣做沒有非常非常非常非常好的理由。如果你不知道你應該怎麼考慮它;-)

+0

非常感謝!有用!早應該已經實現了這個 – TheBlackPearl 2011-02-02 11:06:02

0
self = originalException; 

當你這樣做,你只是分配一個NSException對象添加到您NSCustomException所以 以下的事情將會發生:

  • 你可能會得到一個警告這樣做時, 轉讓以來 CustomException預計但你 只通過NSException 對象;(

  • 之後,編譯器會認爲selfCustomException對象,以便在調用 CustomException類的一些 方法時,但是在到達 那些什麼時候會崩潰 不會抱怨。

您應該啓用initWithName:reason:userinfo:並且不要執行分配。