Po zainstalowaniu Xcode 7 beta i przekonwertowaniu mojego kodu Swift do Swift 2, mam problem z kodem, którego nie mogę rozgryźć. Wiem, że Swift 2 jest nowy, więc szukam i sprawdzam, ponieważ nic na ten temat nie ma, powinienem napisać pytanie.
Oto błąd:
Call może rzucić, ale nie jest oznaczony „try”, a błąd nie jest obsługiwany
Kod:
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 _ {
}
}
Migawka:
try
słowo kluczowe do wywołania funkcji i zadeklarować tę funkcję jakofunc deleteAccountDetail() throw
. Lub jeśli masz zagwarantowane, że funkcja nie będzie rzucać dla danego wejścia, możesz użyćtry!
.deinit()
wywołaniach w celu wyczyszczenia (tj. RAII) lub czasami używaćdefer
go do czyszczenia ad hoc. Aby uzyskać więcej informacji, zobacz exceptionsafecode.com (mówi o C ++, ale podstawowe zasady dotyczą również wyjątków Swift).Podczas wywoływania funkcji, która jest zadeklarowana
throws
w języku Swift, należy oznaczyć witrynę wywołania funkcji za pomocątry
lubtry!
. Na przykład, biorąc pod uwagę funkcję rzucającą:tę funkcję można nazwać następująco:
Tutaj adnotujemy wywołanie
try
, które woła do czytelnika, że ta funkcja może zgłosić wyjątek, a kolejne wiersze kodu mogą nie zostać wykonane. Musimy również oznaczyć tę funkcję adnotacjąthrows
, ponieważ ta funkcja może zgłosić wyjątek (tj. KiedywillOnlyThrowIfTrue()
wyrzuca,foo
automatycznie wyrzuci wyjątek w górę.Jeśli chcesz wywołać funkcję, która jest zadeklarowana jako potencjalnie rzucająca, ale o której wiesz, że nie będzie rzucać w twoim przypadku, ponieważ podajesz jej poprawne dane wejściowe, możesz użyć
try!
.W ten sposób, jeśli gwarantujesz, że kod nie zostanie zgłoszony, nie musisz umieszczać dodatkowego standardowego kodu, aby wyłączyć propagację wyjątków.
try!
jest wymuszane w czasie wykonywania: jeśli użyjesz,try!
a funkcja zakończy się rzucaniem, wykonanie programu zostanie zakończone błędem w czasie wykonywania.Większość kodu obsługi wyjątków powinna wyglądać tak, jak powyżej: albo po prostu propagujesz wyjątki w górę, gdy się pojawią, albo ustawiasz warunki w taki sposób, że w przeciwnym razie możliwe wyjątki są wykluczone. Każde czyszczenie innych zasobów w kodzie powinno nastąpić poprzez zniszczenie obiektu (tj.
deinit()
) Lub czasami za pomocądefer
kodu ed.Jeśli z jakiegoś powodu wyczyścisz kod, który musi działać, ale nie jest w
deinit()
funkcji, możesz użyćdefer
.Większość kodu, który zajmuje się wyjątkami, po prostu propaguje je w górę do wywołań, wykonując po drodze porządki za pośrednictwem
deinit()
lubdefer
. Dzieje się tak, ponieważ większość kodu nie wie, co zrobić z błędami; wie, co poszło nie tak, ale nie ma wystarczających informacji o tym, co jakiś kod wyższego poziomu próbuje zrobić, aby wiedzieć, co zrobić z błędem. Nie wie, czy przedstawienie użytkownikowi okna dialogowego jest właściwe, czy powinno spróbować ponownie, czy też coś innego jest właściwe.Kod wyższego poziomu powinien jednak dokładnie wiedzieć, co zrobić w przypadku jakiegokolwiek błędu. Dlatego wyjątki pozwalają na pojawienie się określonych błędów z miejsca, w którym wystąpiły, do miejsca, w którym można je obsłużyć.
Obsługa wyjątków odbywa się za pośrednictwem
catch
instrukcji.Możesz mieć wiele instrukcji catch, z których każda przechwytuje inny rodzaj wyjątku.
Więcej informacji na temat najlepszych praktyk z wyjątkami można znaleźć pod adresem http://exceptionsafecode.com/ . Jest przeznaczony specjalnie dla C ++, ale po zbadaniu modelu wyjątków Swift, uważam, że podstawy dotyczą również języka Swift.
Szczegółowe informacje na temat składni języka Swift i modelu obsługi błędów można znaleźć w książce The Swift Programming Language (Swift 2 Prerelease) .
źródło
Invalid conversion from throwing function of type '() throws -> _' to non-throwing function type '(NSData?, NSURLResponse?, NSError?) -> Void'
NSData?, NSURLResponse?, NSError?
jako argumenty, ale dajesz mu funkcję, która nie przyjmuje żadnych argumentów.