error handling in cocoa agenda
play

ERROR HANDLING IN COCOA AGENDA Objective-Cs NSError Swifts - PowerPoint PPT Presentation

ERROR HANDLING IN COCOA AGENDA Objective-Cs NSError Swifts try/catch/throws Swifts Result<S,F> type Exceptions & Assertions OBJECTIVE-C ERROR HANDLING NSERROR IN OBJECTIVE-C NSError *error = nil; NSString *string =


  1. ERROR HANDLING IN COCOA

  2. AGENDA Objective-C’s NSError Swift’s try/catch/throws Swift’s Result<S,F> type Exceptions & Assertions

  3. OBJECTIVE-C ERROR HANDLING

  4. NSERROR IN OBJECTIVE-C NSError *error = nil; NSString *string = [NSString stringWithContentsOfFile:@"test.txt" encoding:NSUTF8StringEncoding error:&error]; if (!string) { NSLog(@"File could not be read!"); } if (error) { NSLog(@"%@", error.localizedDescription); }

  5. NSERROR IN OBJECTIVE-C Return value is most relevant for checking whether an operation was successful or not [1] Methods can return errors, but still successfully return a value [1] Apple Error Handling Documentation

  6. NSERROR IN OBJECTIVE-C… 
 …IN THE SAD REAL WORLD NSString *string = [NSString stringWithContentsOfFile:@"test.txt" encoding:NSUTF8StringEncoding error:nil];

  7. SWIFT ERROR HANDLING

  8. SWIFT ERROR HANDLING Swift 2 uses throws instead of NSError Objective-C methods are bridged to Swift accordingly:

  9. CALLING THROWING FUNCTIONS You need to choose one of these 3 approaches: handle the error with a do/catch block Use forced-try: try! propagate the error further up the call stack by declaring calling function as throws

  10. DO/CATCH IN SWIFT do { let content = try String(contentsOfFile: “test.txt", encoding: NSUTF8StringEncoding) } catch let error as NSError { print(error) }

  11. DECLARING ERROR TYPES How do you know which types of errors to catch? Header documentation! Unfortunately throws has no type information

  12. DECLARING ERROR TYPES /** - Returns: the content of the file - Throws: `NSError` if file could not be read */ func readFile() throws -> String { //... }

  13. DEFINING SWIFT ERROR TYPES enum FileReadError: ErrorType { case InvalidFilePath case InvalidEncoding case IncorrectFileFormat(actualFileFormat: String) }

  14. THROWING SWIFT ERROR TYPES /** - Returns: The content of the file - Throws: `FileReadError.InvalidFilePath` if file could not be read; `FileReadError.InvalidEncoding` if file encoding does not match expected encoding; `FileReadError.IncorrectFileFormat` if file format does not match specified one */ func readFile(path: String) throws -> NSData { // ... throw FileReadError.InvalidFilePath }

  15. HANDLING SWIFT ERROR TYPES do { try readFile("test.txt") } catch FileReadError.InvalidFilePath { print("Invalid filepath") } catch FileReadError.InvalidEncoding { print("Invalid encoding") } catch let FileReadError.IncorrectFileFormat(actualFileFormat) { print("Unexpected file format: \(actualFileFormat)") } catch { print("Unhandled Error!") }

  16. LIMITATIONS OF SWIFT ERROR HANDLING Errors don’t have type information Error handling doesn’t work for asynchronous code let request = NSURLRequest(URL: NSURL(string: "https://www.google.com")!) let session = NSURLSession.sharedSession() session.dataTaskWithRequest(request) { (data, response, error) -> Void in // error handling happens in callback }

  17. RESULT TYPE Result type can represent value or error depending on result of operation. Popular Open Source implementation: [2] Can be used for synchronous and asynchronous code func search(searchString: String) -> Result<Predictions, SearchError> [2] https://github.com/antitypical/Result

  18. CONSUMING RESULT TYPE func handleSearchResult(result: Result<Predictions, Reason>) -> Void { switch result { case let .Success(predictions): self.locations = predictions.predictions case .Failure(_): self.errorHandler.displayErrorMessage( "The search returned an error, sorry!" ) } }

  19. PRODUCING RESULT TYPE func fetchAllTrips(callback: Result<[JSONTrip], Reason> -> Void) { // in case of success var trips: [JSONTrip] = [/*...*/] callback(.Success(trips)) // in case of error var reason: Reason = .NoData callback(.Failure(reason)) }

  20. ASSERTIONS AND EXCEPTIONS

  21. EXCEPTIONS Objective-C provides exceptions, Swift does not Objective-C exceptions should not be caught, they are not intended for error handling [1] Exceptions are used to crash the app to make you aware of a programming error [1] Apple Error Handling Documentation

  22. ASSERTIONS Are used to state and verify assumptions Typically only used at debug time Objective-C: NSAssert… Swift: assert , assertionFailure , 
 fatalError , … [3] [3] Swift asserts the missing manual

  23. ASSERTIONS

  24. SUMMARY

  25. SUMMARY Swift 2 uses ErrorType and throws for error handling Swift 2 error handling has limitations (no type info, not suitable for async code) - Result type is a good alternative Exceptions and assertions are used for unrecoverable errors

  26. ADDITIONAL RESOURCES

  27. ADDITIONAL RESOURCES WWDC 106: What’s new in Swift Javi Soto: Swift Sync and Async Error Handling Benjamin Encz: Swift Error Handling and Objective-C Interop in Depth

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend