2015-08-20 2 views
2

Я начал конвертировать один из моих проектов в Swift 2, и я столкнулся с этой проблемой. Для запуска этого блока, приведенного ниже, вполне справедливо try/catch, на самом деле оно было создано средством миграции Xcode.Swift 2 try/catch

do { 
     requestData = try NSJSONSerialization.dataWithJSONObject(requestContents, options: []) 
} catch var error as NSError { 
     requestError = error 
     requestData = nil 
} 

Если я использую тот же код внутри закрытия, такие как dataTaskWithRequest я получаю сообщение об ошибке. Ошибка при назначении задачи, но ее улов вызывает ее. Следующее также работает, но я не фиксирую ошибку.

let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, taskError) -> Void in 
    if taskError != nil { 
     NSLog("Error making request: " + taskError!.localizedDescription) 
    } 
    else { 
     do { 
      let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves) as? NSDictionary 
      if let parseJSON = json as NSDictionary? { 
       // do some parsing here 
      } 
     } 
     catch { 
      NSLog("Error in JSON serialization") 
    } 
    } 
}) 
task.resume() 

, но если я пытаюсь захватить ошибку с:

} catch let e as NSError { 

Я получаю эту ошибку:

Invalid conversion from throwing function of type '(_, _, _) throws -> Void' to non-throwing function type '(NSData?, NSURLResponse?, NSError?) -> Void'

Я обнаружить, что:

} catch _ { 

работает, но много хорошего, что делает меня.

Я что-то упускаю или должен ли я регистрировать ошибку?

(Это Xcode 7b5)

ответ

3

Обработчик завершения dataTaskWithRequest не предназначен, чтобы бросить ошибку как JSONObjectWithData из NSJSONSerialization, чья подпись:

class func JSONObjectWithData(data: NSData, options opt: NSJSONReadingOptions) throws -> AnyObject 

Выполнение следующих будет работать (то же, что вы пробовали):

catch _ 

Но это не даст нам никакой информации об ошибке от одного t шляпа бросает, а именно, от class func JSONObjectWithData.

В результате нам нужен способ, чтобы не использовать броски dataTaskWithRequest, сохраняя тот, который выбрасывает - JSONObjectWithData.

Я попытался следующие:

catch let error as NSError 
{ 
    //error specific to JSON serialization 
    NSLog("Error in JSON serialization \(error)") 
} 
catch 
{ 
    //exhaust the error 
    NSLog("Some error") 
} 
+1

идеально. Я бы не подумал об этом, если бы я не выбрасывал пользовательский ErrorType. Благодаря !! – rjb101

Смежные вопросы