如何在 Swift 2.0 中获取错误消息?

Posted

技术标签:

【中文标题】如何在 Swift 2.0 中获取错误消息?【英文标题】:How do I get the error message in Swift 2.0? 【发布时间】:2015-12-21 20:56:26 【问题描述】:

我在 Swift 1.2 中非常使用这种方法:NSURLConnection.sendSynchronousRequest(:_:_:_),但这在 ios9 中显然已被弃用。但是它仍然有效,但现在它使用新的 Swift 2.0 错误处理,我不知道如果它失败了我将如何得到错误消息,例如。如果时间用完了。

我知道我必须将它放入一个 do-catch 中,然后在方法之前说 try 但我不知道如何捕获错误消息。

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

catch _ 
    return nil

之前我用过 NSError 和它的 description 属性,但现在我不知道了。

【问题讨论】:

hackingwithswift.com/… 【参考方案1】:

使用自动error 变量,如果您愿意,可以将其转换为NSError

catch 
    let nsError = error as NSError
    print(nsError.localizedDescription)

【讨论】:

@redent84:任何 ErrorType 都会自动桥接到 NSError,这在“Using Swift with Cocoa and Objective-C”一书中有记载。 或者只是catch let error as NSError ...,例如(例如)***.com/questions/30954722/…。 谢谢我没有看到任何信息表明错误是这样传递的,我只发现了几个捕获特定错误或根本没有错误的捕获。我可以在 3 分钟内接受 你会得到一些标准的 localizedDescription 用于 Swift-only ErrorType 现在任何Error 都有默认的localizedDescription(见链接)。但从我的测试来看,它似乎只是为我们做了let nsError = error as NSError。 developer.apple.com/reference/swift/error/….【参考方案2】:

您现在可以抛出任何继承 ErrorType 的对象,并在 catch 语句中提供自定义处理。您还可以将错误转换为NSError 以访问localizedDescription 以处理第三方错误。

铸造一个枚举ErrorType 将产生一个NSError,其中domain 等于枚举名称,code 等于枚举值和一个自动生成的localizedDescription,格式如下:

操作无法完成。 (域错误代码。)

例如下面的代码:

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)

将打印

操作无法完成。 (AwfulError 错误 1。)

【讨论】:

【参考方案3】:

尽管问题标题指定了 Swift 2,但此答案适用于 Swift 3。

正如@redent84 指出的那样,由于 Swift 2,Error 对象可能是自制的。这是我编写的一种方法,用于分析和打印未指定任何特定错误类型的“catch”语句中可用的默认错误对象:

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

那么你可以这样称呼它:

    catch 
       printCaughtError(error)
    

【讨论】:

【参考方案4】:

如何获取 userInfo 中的错误message

let errorMessage = (error as NSError).userInfo["message"] as? String

【讨论】:

以上是关于如何在 Swift 2.0 中获取错误消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 2.0 中的 TableView 中获取选中标记的项目

如何在 swift 2.0 中使用 catch 概念

如何在 swift 2.0 中使用 AttributesOfFileSystemForpaths 获取总磁盘空间和可用磁盘空间

如何在 Swift 2.0 中正确解开这些 CLPlacemarks?

处理 Swift 2.0 中的转换错误

Swift:没有互联网连接时如何在 webview 中显示错误消息? [复制]