Object-C異常機制

Object-C異常機制

使用@try...@catch...@finally捕捉異常

Object-c異常處理機制的語法結構
@try
{
       // 業務實現代碼
       ...
}
@catch (異常1 ex)
{
      // 異常處理代碼
}
@catch (異常2 ex)
{
      // 異常處理代碼
      ...
}
// 可能更多的catch塊
...
@finally
{

}
如果執行@try塊裏的業務邏輯代碼時出現異常,系統將自動生成一個異常對象,拋出異常,由相應的@catch塊捕獲異常。
@try,@catch塊後的花括號({...})不可以省略

當運行環境接受到異常對象時,會依次判斷該異常對象是否是@catch塊後異常類或其子類的實例。

NSException異常提供了異常類的根類。進行異常捕獲是不僅應該把NSException對應的@catch塊放在最後,所有父類異常的@catch塊都應排在子類異常@catch塊的後面。
先處理小異常,在處理大異常。
所有的異常對象都包含如下幾個常用方法。
name:返回該異常詳細的名稱。
reason:返回引發該異常的原因。
userInfo:返回引發該異常的用戶附加信息,該方法的返回值是一個NSDictionary對象。

NSLog(@"捕獲異常:%@,%@", ex.name , ex.reason);

使用@finally回收資源
@finally塊總會被執行。

BOOL test()
{
      @try
      {
            // 因爲finally塊中包含了return語句,所以下面的return語句失去作用
      }
      @finally
      {
            return NO;
      }
}

當程序執行@try塊,@catch塊時遇到了return語句或@throw語句,這兩個語句都會導致該方法立即結束,但是系統執行這兩個語句並不會結束該方法,而是去尋找該異常處理流程中是否包含@finally塊,如果沒有@finally塊,程序立即執行return語句或@throw語句,方法終止。如果有@finally塊,系統立即開始執行@finally塊--只有當@finally塊執行完成後,系統纔會再次跳回來執行@try塊,@catch塊裏的return或@throw語句,如果@finally塊裏也使用了return或@throw等導致方法終止的語句,則@finally塊已經終止了方法,系統將不會跳回去執行@try塊,@catch塊裏的任何代碼。
儘量避免在@finally中使用return或@throw。

拋出異常和自定義異常類
使用@throw拋出異常,如果需要在程序中自行拋出異常,應使用@throw語句,@throw語句可以單獨使用,@throw語句拋出的不是異常類,而是一個異常實例,而且每次只能拋出一個異常實例
@throw ExceptionInstance;

// 定義類的接口部分
@interface MyException : NSException
@end

// 定義類的接口部分
@interface Dog : NSObject
@property (nonatomic , assign) int age;
@end

// Dog提供實現部分
@implementation Dog
@synthesize age = _age
-(void) setAge : (int) age
{
      if (self.age != age)
      { 
           // 手動拋出異常
           @throw [[MyException alloc] initWithName : @"InlleagelaArgumentException" reason:@"" userInfo:nil];
      }
}















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章