Setelah saya menginstal Xcode 7 beta dan mengkonversi kode swift saya ke Swift 2, saya mendapatkan beberapa masalah dengan kode yang tidak dapat saya pahami. Saya tahu Swift 2 baru, jadi saya mencari dan mencari tahu karena tidak ada apa-apa tentang itu, saya harus menulis pertanyaan.
Inilah kesalahannya:
Panggilan dapat dilemparkan, tetapi tidak ditandai dengan 'coba' dan kesalahannya tidak ditangani
Kode:
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 _ {
}
}
Foto:
try
kata kunci ke panggilan fungsi, dan menyatakan fungsi ini sebagaifunc deleteAccountDetail() throw
. Atau jika Anda telah menjamin bahwa fungsi tersebut tidak akan membuang input yang diberikan, Anda dapat menggunakannyatry!
.deinit()
panggilan implisit untuk melakukan pembersihan (yaitu, RAII), atau sesekali digunakandefer
untuk melakukan pembersihan ad hoc. Lihat exceptionionsafecode.com untuk informasi lebih lanjut (Ini berbicara tentang C ++, tetapi prinsip-prinsip dasar berlaku untuk pengecualian Swift juga.)Saat memanggil fungsi yang dideklarasikan dengan
throws
di Swift, Anda harus membuat anotasi situs panggilan fungsi dengantry
atautry!
. Misalnya, diberi fungsi melempar:fungsi ini bisa disebut seperti:
Di sini kita membubuhi keterangan panggilan
try
, yang memanggil pembaca bahwa fungsi ini dapat menimbulkan pengecualian, dan setiap baris kode berikut mungkin tidak dieksekusi. Kita juga harus membubuhi keterangan fungsi inithrows
, karena fungsi ini bisa melempar pengecualian (yaitu, ketikawillOnlyThrowIfTrue()
melempar, makafoo
akan secara otomatis menggabungkan kembali pengecualian ke atas.Jika Anda ingin memanggil fungsi yang dinyatakan sebagai kemungkinan melempar, tetapi yang Anda tahu tidak akan melempar dalam kasus Anda karena Anda memberikan input yang benar, Anda dapat menggunakannya
try!
.Dengan cara ini, ketika Anda menjamin bahwa kode tidak akan dibuang, Anda tidak perlu memasukkan kode boilerplate tambahan untuk menonaktifkan propagasi pengecualian.
try!
diberlakukan pada saat runtime: jika Anda menggunakantry!
dan fungsi tersebut akhirnya membuang, maka eksekusi program Anda akan diakhiri dengan kesalahan runtime.Sebagian besar pengecualian menangani kode harus terlihat seperti di atas: Anda cukup menyebarkan pengecualian ke atas ketika mereka terjadi, atau Anda mengatur kondisi sehingga pengecualian yang mungkin dikesampingkan. Setiap pembersihan sumber daya lain dalam kode Anda harus terjadi melalui penghancuran objek (yaitu
deinit()
), atau kadang-kadang melaluidefer
kode ed.Jika karena alasan apa pun Anda memiliki kode pembersihan yang perlu dijalankan tetapi tidak
deinit()
berfungsi, Anda dapat menggunakannyadefer
.Sebagian besar kode yang berhubungan dengan pengecualian hanya membuat mereka menyebar ke atas ke penelepon, melakukan pembersihan di jalan melalui
deinit()
ataudefer
. Ini karena sebagian besar kode tidak tahu apa yang harus dilakukan dengan kesalahan; ia tahu apa yang salah, tetapi tidak memiliki informasi yang cukup tentang apa yang beberapa kode tingkat tinggi coba lakukan untuk mengetahui apa yang harus dilakukan tentang kesalahan. Itu tidak tahu apakah menyajikan dialog kepada pengguna sesuai, atau apakah itu harus mencoba lagi, atau jika sesuatu yang lain sesuai.Namun, kode tingkat yang lebih tinggi harus tahu persis apa yang harus dilakukan jika terjadi kesalahan. Jadi pengecualian memungkinkan kesalahan spesifik muncul dari tempat awalnya terjadi ke tempat penanganannya.
Menangani pengecualian dilakukan melalui
catch
pernyataan.Anda dapat memiliki beberapa pernyataan penangkapan, masing-masing menangkap jenis pengecualian yang berbeda.
Untuk detail lebih lanjut tentang praktik terbaik dengan pengecualian, lihat http://exceptionsafecode.com/ . Ini khusus ditujukan untuk C ++, tetapi setelah memeriksa model pengecualian Swift, saya percaya dasar-dasar berlaku untuk Swift juga.
Untuk detail tentang sintaks Swift dan model penanganan kesalahan, lihat buku Swift Programming Language (Swift 2 Prerelease) .
sumber
Invalid conversion from throwing function of type '() throws -> _' to non-throwing function type '(NSData?, NSURLResponse?, NSError?) -> Void'
NSData?, NSURLResponse?, NSError?
sebagai argumen, tetapi Anda memberinya fungsi yang tidak mengambil argumen apa pun.