После того, как я установил бета-версию Xcode 7 и преобразовал свой swift-код в Swift 2, у меня возникла проблема с кодом, которую я не могу понять. Я знаю, что Swift 2 является новым, поэтому я ищу и выясняю, так как в этом нет ничего, я должен написать вопрос.
Вот ошибка:
Вызов может скинуть, но он не помечен как «попробуй» и ошибка не обработана
Код:
func deleteAccountDetail(){
let entityDescription = NSEntityDescription.entityForName("AccountDetail", inManagedObjectContext: Context!)
let request = NSFetchRequest()
request.entity = entityDescription
//The Line Below is where i expect the error
let fetchedEntities = self.Context!.executeFetchRequest(request) as! [AccountDetail]
for entity in fetchedEntities {
self.Context!.deleteObject(entity)
}
do {
try self.Context!.save()
} catch _ {
}
}
Снимок:
try
ключевое слово в вызов функции и объявить эту функцию какfunc deleteAccountDetail() throw
. Или, если вы гарантировали, что функция не сработает для данного ввода, вы можете использоватьtry!
.deinit()
вызовы, чтобы выполнить очистку (т. Е. RAII) или иногда использоватьdefer
для некоторой специальной очистки. См. Exceptionsafecode.com для получения дополнительной информации (При вызове функции, объявленной
throws
в Swift, вы должны аннотировать сайт вызова функции с помощьюtry
илиtry!
. Например, учитывая функцию броска:эта функция может быть вызвана так:
Здесь мы аннотируем вызов с
try
, который вызывает читателя, что эта функция может вызвать исключение, и любые последующие строки кода могут не выполняться. Мы также должны пометить эту функцию с помощьюthrows
, потому что эта функция может генерировать исключение (то есть, когдаwillOnlyThrowIfTrue()
выбрасывает, тоfoo
автоматически сбросит исключение вверх.Если вы хотите вызвать функцию, которая объявлена как возможно сгенерированная, но которую вы знаете, не сгенерирует в вашем случае, потому что вы даете ей правильный ввод, вы можете использовать
try!
.Таким образом, когда вы гарантируете, что код не сработает, вам не нужно вводить дополнительный шаблонный код, чтобы отключить распространение исключений.
try!
принудительно выполняется во время выполнения: если вы используетеtry!
и функция в конечном итоге выбрасывает, то выполнение вашей программы будет прервано с ошибкой во время выполнения.Большая часть кода обработки исключений должна выглядеть следующим образом: либо вы просто распространяете исключения вверх, когда они возникают, либо вы устанавливаете условия так, чтобы исключить возможные исключения. Любая очистка других ресурсов в вашем коде должна происходить с помощью уничтожения объекта (т.е.
deinit()
) или иногда с помощьюdefer
редактируемого кода.Если по какой-либо причине у вас есть код для очистки, который должен быть запущен, но отсутствует в
deinit()
функции, вы можете использоватьdefer
.Большая часть кода, который имеет дело с исключениями, просто передает их вызывающим абонентам, делая очистку по пути через
deinit()
илиdefer
. Это потому, что большая часть кода не знает, что делать с ошибками; он знает, что пошло не так, но у него недостаточно информации о том, что пытается сделать какой-то код более высокого уровня, чтобы узнать, что делать с ошибкой. Он не знает, подходит ли представление диалога пользователю, следует ли повторить попытку, или что-то еще подходит.Однако код более высокого уровня должен точно знать, что делать в случае любой ошибки. Таким образом, исключения позволяют конкретным ошибкам всплывать от того места, где они изначально возникли, до места, где они могут быть обработаны.
Обработка исключений осуществляется с помощью
catch
операторов.Вы можете иметь несколько операторов catch, каждый из которых перехватывает свое исключение.
Для получения дополнительной информации о передовых практиках с исключениями см. Http://exceptionsafecode.com/ . Он специально нацелен на C ++, но после изучения модели исключений Swift, я думаю, что основы применимы и к Swift.
Подробнее о синтаксисе Swift и модели обработки ошибок см. Книгу «Язык программирования Swift (предварительный выпуск Swift 2)» .
источник
Invalid conversion from throwing function of type '() throws -> _' to non-throwing function type '(NSData?, NSURLResponse?, NSError?) -> Void'
NSData?, NSURLResponse?, NSError?
качестве аргументов, но вы даете ему функцию, которая не принимает никаких аргументов.