我在應用程序上運行模糊測試,所以我專門查找未處理的運行時錯誤。該應用程序是用ObjC和Swift編寫的,但是單元測試是用Swift編寫的。Swift Catch運行時異常
我明白swift的基礎並不是捕捉任意運行時異常,但這純粹是爲了單元測試。如何捕獲運行時異常(即索引越界等)
我在應用程序上運行模糊測試,所以我專門查找未處理的運行時錯誤。該應用程序是用ObjC和Swift編寫的,但是單元測試是用Swift編寫的。Swift Catch運行時異常
我明白swift的基礎並不是捕捉任意運行時異常,但這純粹是爲了單元測試。如何捕獲運行時異常(即索引越界等)
趕上斯威夫特的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異常是邪惡的,我只使用它,因爲我需要一個使用它們的庫。
好主意,upvoted。我做了一些小小的增強:1)將異常返回給Swift作爲catchException()的返回值,以便它可以檢查異常類或任何屬性(如原因),包括NSException子類中的自定義屬性。不要將其轉換爲NSError。 2)Catch ID,以防某人拋出一個不是從NSException派生的異常。 –
@VaddadiKartick如果你想使用Swift'try'你不應該返回這個異常,並且你需要'NSError'轉換:)在Obj-C中處理Obj-C的'NSError',Swift'try'基於這個'假設你返回如果有錯誤,則爲'nil'(或'false')。 – Sulthan
我明白你的偏好。我只是想說我不介意將異常作爲返回值,並且我希望將Objective-C中提供的所有信息傳回給Swift。 –
我們是在談論Obj-C異常還是Swift異常? Swift異常不容易處理。 Obj-C異常可以簡單地使用實用程序Obj-C函數捕獲。 – Sulthan
我認爲大部分的錯誤都來自於ObjC--一個解決方案就足夠了! –