对比 attempt、try? 和 try!
在 Swift 中,
前一阵子,我写了 实现可打印内容的 try? 和 try!。它在保存错误信息和使用基于可选值的控制语句之间提供了一个平衡点。 随着时间的推移,我开始逐步调整我的这个做法,尝试去完善和精简我的想法。我的目的是:重现 我的 最新的 单独使用的 attempt { let mgr = NSFileManager.defaultManager() try mgr.createDirectoryAtPath( "/Users/notarealuser",withIntermediateDirectories: true,attributes: nil) } 但是,需要结合 guard let fileContents = attempt(closure: { _ -> [NSURL] in let url = NSURL(fileURLWithPath: "/Users/notarealuser") let mgr = NSFileManager.defaultManager() return try mgr.contentsOfDirectoryAtURL( url,includingPropertiesForKeys: nil,options: []) }) else { fatalError("failed") }
/// 由文件路径 (File Path)、行数 (Line Number) 和错误元组 (Error Tuple) 组成 public typealias CommonErrorHandlerType = (String,Int,ErrorType) -> Void /// 可以打印上下文和错误的默认错误处理器 public let defaultCommonErrorHandler: CommonErrorHandlerType = { filePath,lineNumber,error in let trimmedFileName: String = (filePath as NSString).lastPathComponent print("Error (trimmedFileName):(lineNumber) (error)") } /// 引入错误处理器来替代 `try?` /// 默认的错误处理器将会在返回 nil 之前打印错误信息 public func attempt<T>( file fileName: String = __FILE__,line lineNumber: Int = __LINE__,crashOnError: Bool = false,errorHandler: CommonErrorHandlerType = defaultCommonErrorHandler,// 感谢 http://twitter.com/Kametrixom/status/709809975447707648 @noescape closure: () throws -> T) -> T? { do { // 只有当闭包成功的时候,才会返回执行,这会返回 T return try closure() } catch { // 通过崩溃来模仿 try! if crashOnError { print("Fatal error (fileName):(lineNumber): (error)") fatalError() } // 运行错误处理器,并返回 nil errorHandler(fileName,error) return nil } } 一如既往,如果您发现了任何问题,或者有任何建议的话,请联系我,让我知晓。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |