2017-03-23 1 views
2

Ich führe Fuzz-Tests für eine Anwendung durch und suche daher speziell nach Laufzeitfehlern, die nicht behandelt werden. Die Anwendung wird sowohl in ObjC als auch in Swift geschrieben, aber die Komponententests werden in Swift geschrieben.Swift Catch Runtime-Ausnahmen

Ich verstehe die Basis von Swift ist nicht willkürliche Laufzeit Ausnahmen zu fangen, aber das ist rein für Komponententests. Wie fange ich diese Ausnahmen Laufzeit (dh Index außerhalb der Grenzen etc.)

+0

Sprechen wir über Obj-C-Ausnahmen oder Swift-Ausnahmen? Schnelle Ausnahmen sind nicht einfach zu handhaben. Obj-C-Ausnahmen können einfach mit der Obj-C-Funktion eines Dienstprogramms abgefangen werden. – Sulthan

+0

Ich denke, dass die meisten Fehler von ObjC kommen werden - eine Lösung für genau diese würde ausreichen! –

Antwort

3

Obj-C Ausnahmen in Swift zu fangen, ich bin eine einfache Obj-C-Klasse:

#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 

In Swift genannt als

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

Sie benötigen möglicherweise eine andere Variante für Blöcke, die nichts zurückgeben.

Nicht zu sein missbraucht. Obj-C Ausnahme sind böse und ich benutze dies nur, weil ich eine Bibliothek brauche, die sie verwendet.

+0

Großartige Idee, upvoted. Ich habe ein paar kleinere Verbesserungen vorgenommen: 1) Übergeben Sie die Exception an Swift als Rückgabewert von catchException(), damit die Ausnahmeklasse oder alle Eigenschaften wie reason überprüft werden können, einschließlich benutzerdefinierter Eigenschaften in einer NSException-Unterklasse. Konvertiere es nicht in einen NSError. 2) Catch-ID, falls jemand eine Ausnahme auslöst, die nicht von NSException abgeleitet ist. –

+0

@VaddadiKartick Wenn Sie Swift 'try' verwenden wollen, sollten Sie die Ausnahme nicht zurückgeben und Sie benötigen die' NSError' Konvertierung :) Die 'NSError' Behandlung in Obj-C, auf der Swift' try' basiert, setzt voraus, dass Sie zurückkehren 'nil' (oder' false') wenn ein Fehler vorliegt. – Sulthan

+0

Ich habe Ihre Präferenz verstanden. Ich wollte nur sagen, dass es mir nichts ausmacht, die Ausnahme als Rückgabewert zu erhalten, und dass ich alle in Objective-C verfügbaren Informationen an Swift zurückgeben möchte. –