Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在Swift 2.0中获取错误消息?_Ios_Swift_Error Handling_Try Catch_Swift2 - Fatal编程技术网

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

Ios 如何在Swift 2.0中获取错误消息?,ios,swift,error-handling,try-catch,swift2,Ios,Swift,Error Handling,Try Catch,Swift2,我在Swift 1.2:NSURLConnection.sendSynchronousRequest(:::\u:\ uuuu)中经常使用这种方法,但在iOS9中显然不推荐使用这种方法。但是它仍然可以工作,但是现在它使用了新的Swift 2.0错误处理,我不知道如果它失败,我将如何获得错误消息,例如,如果时间用完 我知道我必须把它放到一个do catch中,然后在metro之前说try,但我不知道如何捕捉错误消息 do { let data = try NSURLConnection.s

我在Swift 1.2:
NSURLConnection.sendSynchronousRequest(:::\u:\ uuuu)
中经常使用这种方法,但在iOS9中显然不推荐使用这种方法。但是它仍然可以工作,但是现在它使用了新的Swift 2.0错误处理,我不知道如果它失败,我将如何获得错误消息,例如,如果时间用完

我知道我必须把它放到一个do catch中,然后在metro之前说try,但我不知道如何捕捉错误消息

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

之前我使用了NSError,然后使用了它的description属性,但现在我没有任何线索。

使用automatic
error
变量,如果愿意,您可以将其强制转换为
NSError

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

您现在可以抛出继承
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)
}
将打印

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


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

正如@redent84所指出的,由于Swift 2,错误对象可能是自制的。下面是我编写的一个方法,用于分析和打印“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)
    }

@redent84:任何错误类型都会自动桥接到NSError,这在“使用Swift与Cocoa和Objective-C”一书中有记录。或者简单地
catch let error as NSError{…}
as in(例如)。谢谢,我没有看到任何信息表明错误是这样传递的,我只发现了几个捕获了特定错误,或者根本没有。我可以在3分钟内接受您将获得一些标准的
localizedDescription
仅用于Swift
ErrorType
。对于任何
Error
现在都有默认的
localizedDescription
(请参见链接)。但是,从我的测试来看,它似乎对我们来说只是
let nsError=error as nsError