2015-09-24 8 views
17

Ho usato molto questo metodo in Swift 1.2: NSURLConnection.sendSynchronousRequest(:_:_:_) ma questo è apparentemente deprecato in iOS9. Funziona comunque ma ora utilizza il nuovo Swift 2.0 Error Handling e non so come otterrò il messaggio di errore se fallisce, es. se il tempo si esaurisce.Come ottengo il messaggio di errore in Swift 2.0?

So che devo metterlo in un do-catch e quindi dire provare prima il metho ma non so come catturare il messaggio di errore.

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

Prima ho usato NSError e quindi la sua descrizione, ma ora non ne ho idea.

+0

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

risposta

31

Usa variabile automatica error, e si può lanciare a NSError se lo si desidera:

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

Cosa succede se l'errore non è un 'NSError'? – redent84

+2

@ redent84: Qualsiasi ErrorType viene collegato automaticamente a NSError, documentato nel libro "Uso di Swift con Cocoa e Objective-C". –

+7

O semplicemente "catch let error as NSError {...}" come in (ad esempio) http://stackoverflow.com/questions/30954722/swift-2-executefetchrequest-error-handling. –

4

È ora possibile gettare qualsiasi oggetto che eredita ErrorType, e fornire personalizzato movimentazione nella frase catch. È anche possibile trasmettere l'errore a NSError per accedere a localizedDescription per la gestione degli errori di terze parti.

Casting un'enumerazione ErrorType produrrà un NSError con domain uguale al nome enum, code uguale al valore di enumerazione e un auto-generato localizedDescription con il seguente formato:

L'operazione potrebbe non essere completata . (Codice di dominio di errore.)

Ad esempio, il seguente codice:

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) 
} 

stamperà

L'operazione non ha potuto essere completato. (Errore AwfulError 1.)

0

Nonostante il titolo della domanda specificando Swift 2, questa risposta è per Swift 3.

Come @ redent84 sottolinea, in quanto Swift 2 un oggetto errore può essere un fatto in casa . Ecco un metodo che ho scritto per analizzare e stampare l'oggetto di errore predefinito disponibile in un comunicato "catturare" che non specifica alcun tipo specifico di errore:

// 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) 
    } 

Poi si può chiamare in questo modo:

catch { 
     printCaughtError(error) 
    }