2015-09-24 4 views
17

Ich habe diese Methode sehr in Swift 1.2: NSURLConnection.sendSynchronousRequest(:_:_:_) verwendet, aber das ist offenbar in iOS9 veraltet. Es funktioniert immer noch, aber jetzt verwendet es die neue Swift 2.0 Fehlerbehandlung und ich weiß nicht, wie ich die Fehlermeldung erhalten werde, wenn es fehlschlägt, z. wenn die Zeit abläuft.Wie bekomme ich die Fehlermeldung in Swift 2.0?

Ich weiß, ich muss es in einen Do-Catch setzen und dann versuchen, vor dem Metho versuchen, aber ich weiß nicht, wie man die Fehlermeldung zu fangen.

do { 
    let data = try NSURLConnection.sendSynchronousRequest(request, returningResponse: nil) 
    return data 
} 
catch _ { 
    return nil 
} 

Bevor ich NSError und dann seine Beschreibung Eigenschaft verwendet habe, aber jetzt habe ich keine Ahnung.

+0

https://www.hackingwithswift.com/new-syntax-swift-2-error-handling-try-catch – CptEric

Antwort

31

Verwenden Sie die automatische error Variable, und Sie können es auf NSError werfen, wenn Sie möchten:

catch { 
    let nsError = error as NSError 
    print(nsError.localizedDescription) 
} 
+1

Was ist, wenn der Fehler kein 'NSError' ist? – redent84

+2

@redent84: Jeder ErrorType wird automatisch mit NSError verbunden, was im Buch "Using Swift with Cocoa and Objective-C" dokumentiert ist. –

+7

Oder einfach "fangen lassen Fehler als NSError {...}' wie in (zum Beispiel) http://stackoverflow.com/questions/30954722/swift-2-executefetchrequest-error-handling. –

4

Sie können nun jedes Objekt werfen ErrorType erben und benutzerdefinierte im catch Satz Handhabung bieten. Sie können den Fehler auch auf NSError umwandeln, um auf localizedDescription für die Behandlung von Fehlern von Drittanbietern zuzugreifen.

ErrorType eine ENUM Casting wird ein NSError mit domain gleich dem ENUM-Namen, code gleich dem ENUM-Wert und eine automatisch generierte localizedDescription mit folgendem Format erzeugen:

konnte nicht abgeschlossen werden

Der Betrieb . (DOMAIN Fehlercode.)

Zum Beispiel der folgende Code:

enum AwfulError: ErrorType { 
    case Bad 
    case Worse 
    case Terrible 
} 

func throwingFunction() throws { 
    throw AwfulError.Worse 
} 

do { 
    try throwingFunction() 
} 
catch AwfulError.Bad { 
    print("Bad error") 
} 
catch let error as NSError { 
    print(error.localizedDescription) 
} 

Der Betrieb druckt nicht abgeschlossen werden konnte. (AwfulError Fehler 1.)

0

Trotz der Frage Titel Angabe Swift 2, diese Antwort ist für Swift 3.

Wie @ redent84 weist darauf hin, da Swift 2 ein Error-Objekt ein hausgemachtes eins sein . Hier ist eine Methode, die ich schrieb das Standardfehlerobjekt in einer „fängt“ Anweisung zu analysieren und drucken, das keinen spezifischen Fehlertyp nicht angeben:

// Method to print an unknown Error type object to the system output. 
    static func printCaughtError(_ unknownError : Error) { 
     let objectDescription = String(describing: unknownError) 
     let localizedDescription = unknownError.localizedDescription 
     if localizedDescription != "" { 
     if localizedDescription.contains(objectDescription) { 
      print(localizedDescription) 
      return 
     } 
     if !objectDescription.contains(localizedDescription) { 
      print(objectDescription + ": " + localizedDescription) 
      return 
     } 
     } 
     print(objectDescription) 
    } 

Dann können Sie es so nennen:

catch { 
     printCaughtError(error) 
    }