2015-08-04 3 views
13

Обновления до 2,0 с помощью Xcode 7 Beta 4Swift 2.0 Ошибки, брошенная здесь не обрабатывается

У меня есть этот блок кода

do 
{ 
    try AVAudioSession.sharedInstance().setActive(true) 
} catch let err as NSError 
{ 
    println("Dim background error") 
} 

И его дает мне ошибку (на try линии)

Ошибки, выброшенные отсюда, не обрабатываются.

Является ли это ошибкой компилятора или есть что-то, что мне не хватает в синтаксисе?

Я проверил документы, и мой код «выглядит» правильным.

+0

Заменить '' println' на print' и перезапустить 'xcode'. Возможно, у компилятора есть проблемы. –

ответ

2

Может быть ошибкой компилятора. В любом случае попробуйте удалить let err as NSError; catch достаточно, если вы хотите поймать все ошибки.

Кроме того, с помощью Swift 2 вы должны использовать print, а не println.

Следующий код компилируется без ошибок с XCode 7 Beta 4:

import AVFoundation 

class X { 
    func y() { 
     do { 
      try AVAudioSession.sharedInstance().setActive(true) 
     } catch { 
      print("Dim background error \(error)") 
     } 
    } 
} 
+0

Я пробовал это до публикации, тоже не работал. Я думаю, что эта бета-версия 4 является нестабильной. – Aggressor

+0

Вы пробовали именно этот код ?. Во всяком случае, я просто обновил свои ответы с помощью фрагмента кода, который без проблем компилируется с помощью XCode 7 Beta 4. –

+0

Я думаю, что проблема с моим проектом в целом. Theres 200+ ошибок, а подсветка синтаксиса и автозаполнения приводит к сбою второй, которую я пытаюсь ввести (как и первая версия Swift, это невероятно неустойчиво). – Aggressor

17

Какие типы ошибок могут AVAudioSession.sharedInstance().setActive(true) бросить?
Если он может только выкинуть NSError с, тогда нет необходимости указывать это при обнаружении ошибки. Вы могли бы просто написать:

do { 
    try AVAudioSession.sharedInstance().setActive(true) 
} catch { 
    print("Dim background error") 
} 

Если вы хотите использовать ошибку в вашем catch -scope, вы можете получить доступ к нему. Swift автоматически связывает брошенную ошибку в error, который может быть использован:

catch { 
    // do something with `error` 
} 

Если метод бросает несколько типов ошибок, и вы только хотите иметь дело с теми, которые NSError s, вы можете условно связать их:

catch let specialError as NSError { 
    // do something with `specialError` 
} 

Вы должны убедиться, что каждая брошенная ошибка обрабатывается. Таким образом, если предположить, что этот метод может также бросить RandomError (который я только что сделал сейчас), вы должны написать:

catch let randomError as RandomError { 
    // do something with `randomError` 
} 

... в дополнение к catch в NSError.
Или вы могли бы, конечно, использовать общий случай:

catch { 
    // do something with `error` 
} 

Так я предполагаю, что проблему можно решить путем удаления let err as NSError, с вашего catch -statement.

+2

Да, компилятор сломан, я думаю. Автокомпьютер терпит неудачу (наряду с подсветкой синтаксиса), и я пробовал генерики и, в частности, он бы бросил (никто не работал). Я должен был упомянуть в своем посте. Извинения за упущение. – Aggressor

+0

В следующий раз я также опубликую скриншот, я думаю, что он добавляет вес в такую ​​ситуацию, как этот ха-ха. – Aggressor

+0

Если это помогает, добавьте его :) –

-1

проверить это код, который вы получите представление о Try/уловом:

enum ErrorMessages :ErrorType { 
    case ErrorDescription 
    } 

do 
{ 
    try AVAudioSession.sharedInstance().setActive(true) 
} catch ErrorMessages.ErrorDescription 
    { 
    println("Present the error description here") 
    } 
Смежные вопросы