2017-03-23 81 views
2

我在應用程序上運行模糊測試,所以我專門查找未處理的運行時錯誤。該應用程序是用ObjC和Swift編寫的,但是單元測試是用Swift編寫的。Swift Catch運行時異常

我明白swift的基礎並不是捕捉任意運行時異常,但這純粹是爲了單元測試。如何捕獲運行時異常(即索引越界等)

+0

我們是在談論Obj-C異常還是Swift異常? Swift異常不容易處理。 Obj-C異常可以簡單地使用實用程序Obj-C函數捕獲。 – Sulthan

+0

我認爲大部分的錯誤都來自於ObjC--一個解決方案就足夠了! –

回答

3

趕上斯威夫特的OBJ-C的異常,我用一個簡單的OBJ-C等級:

#import "ObjC2Swift.h" 

@implementation ObjC 

+ (id)catchException:(id(^)())tryBlock error:(__autoreleasing NSError **)error { 
    @try { 
     id result = tryBlock(); 
     return result; 
    } 
    @catch (NSException *exception) { 
     if (error) { 
      *error = [[NSError alloc] initWithDomain:exception.name code:0 userInfo:exception.userInfo]; 
     } 
     return nil; 
    } 
} 

@end 

在斯威夫特稱爲

let result = try? ObjC.catchException { ... dangerous code here ... } 

對於不返回任何內容的塊,您可能需要一個不同的變體。

不是濫用。 Obj-C異常是邪惡的,我只使用它,因爲我需要一個使用它們的庫。

+0

好主意,upvoted。我做了一些小小的增強:1)將異常返回給Swift作爲catchException()的返回值,以便它可以檢查異常類或任何屬性(如原因),包括NSException子類中的自定義屬性。不要將其轉換爲NSError。 2)Catch ID,以防某人拋出一個不是從NSException派生的異常。 –

+0

@VaddadiKartick如果你想使用Swift'try'你不應該返回這個異常,並且你需要'NSError'轉換:)在Obj-C中處理Obj-C的'NSError',Swift'try'基於這個'假設你返回如果有錯誤,則爲'nil'(或'false')。 – Sulthan

+0

我明白你的偏好。我只是想說我不介意將異常作爲返回值,並且我希望將Objective-C中提供的所有信息傳回給Swift。 –