2017-05-09 1 views
4

Mein Verständnis von try? war, dass, wenn der Ausdruck nach try? ausgewertet wird, nil zurückgegeben wird, wenn es eine Ausnahme gibt, andernfalls wird der Rückgabewert der Funktion zurückgegeben.versuchen? propagiert eher als Null zurück

Wenn ich den folgenden Code ausführen:

guard let istream = InputStream(url: url), 
     let ambiguousObj = try? JSONSerialization.jsonObject(with: istream, options: []), 
     let jsonObj = ambiguousObj as? [[String: Any]] else { 
    throw ExportError.recoveredParseFailed 
} 

Ich erhalte eine Fehlermeldung über in die zweite Zeile im Zusammenhang:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[NSJSONSerialization JSONObjectWithStream:options:error:]: stream is not open for reading' 

Ich verstehe, wie die Fehler zu beheben. (ich brauchte istream.open() zu nennen)

Aber, könnte mir jemand helfen zu verstehen, warum try? nicht die Ausnahme in diesem Fall fangen hat?

+0

Haben Sie den obigen Code in 'do {} catch {}' block hinzugefügt? –

+0

@BalajiGalave OP benutzt 'try?', Nicht 'try', keine Notwendigkeit für einen Do-Catch-Block. – Moritz

+0

Ja, ich habe es verstanden. Wir brauchen es nicht, während Versuch optional ist –

Antwort

4

try? wertet den Ausdruck aus und gibt nil wenn ein Swift Fehler bei der Auswertung geworfen wird. In Ihrer Situation wirft die Stiftung Bibliothek ein Objective-C NSException, als ob Sie eine Ausnahme Haltepunkt gesetzt zu sehen ist:

 
(lldb) bt 
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1 
    frame #0: 0x00007fffbe5cb45d libobjc.A.dylib`objc_exception_throw 
    frame #1: 0x00007fffa9855c3d CoreFoundation`+[NSException raise:format:] + 205 
    frame #2: 0x00007fffab3a001a Foundation`+[NSJSONSerialization JSONObjectWithStream:options:error:] + 178 

Objective-C Ausnahmen nicht in Swift gefangen werden (es sei denn Sie ein verwenden Objective-C-Wrapper, siehe zum Beispiel Catching NSException in Swift).