Ada dua poin penting pada model penanganan kesalahan Swift 2: kelengkapan dan ketahanan. Bersama-sama, mereka direbus ke do
/ catch
pernyataan Anda perlu menangkap setiap kesalahan yang mungkin, bukan hanya yang Anda tahu Anda bisa melempar.
Perhatikan bahwa Anda tidak menyatakan jenis kesalahan apa yang bisa dilempar suatu fungsi, hanya apakah itu benar-benar melempar. Ini adalah nol-satu-infinity masalah: sebagai seseorang yang mendefinisikan fungsi untuk orang lain (termasuk diri masa depan Anda) untuk digunakan, Anda tidak ingin harus membuat setiap klien fungsi Anda beradaptasi dengan setiap perubahan dalam implementasi Anda fungsi, termasuk kesalahan apa yang bisa dilemparkan. Anda ingin kode yang memanggil fungsi Anda tangguh terhadap perubahan tersebut.
Karena fungsi Anda tidak bisa mengatakan kesalahan apa yang dilemparkannya (atau mungkin terjadi di masa depan), catch
blok yang menangkap kesalahan itu tidak tahu jenis kesalahan apa yang mungkin ditimbulkannya. Jadi, selain menangani jenis kesalahan yang Anda ketahui, Anda perlu menangani yang tidak Anda lakukan dengan catch
pernyataan universal - dengan cara itu jika fungsi Anda mengubah set kesalahan yang dilemparkannya di masa depan, penelepon masih akan menangkap kesalahannya. kesalahan.
do {
let sandwich = try makeMeSandwich(kitchen)
print("i eat it \(sandwich)")
} catch SandwichError.NotMe {
print("Not me error")
} catch SandwichError.DoItYourself {
print("do it error")
} catch let error {
print(error.localizedDescription)
}
Tapi jangan berhenti di situ. Pikirkan lagi gagasan ketahanan ini. Cara Anda mendesain sandwich Anda, Anda harus menggambarkan kesalahan di setiap tempat Anda menggunakannya. Itu berarti bahwa setiap kali Anda mengubah set kasus kesalahan, Anda harus mengubah setiap tempat yang menggunakannya ... tidak terlalu menyenangkan.
Gagasan di balik mendefinisikan jenis kesalahan Anda sendiri adalah membiarkan Anda memusatkan hal-hal seperti itu. Anda dapat menentukan description
metode untuk kesalahan Anda:
extension SandwichError: CustomStringConvertible {
var description: String {
switch self {
case NotMe: return "Not me error"
case DoItYourself: return "Try sudo"
}
}
}
Dan kemudian kode penanganan kesalahan Anda dapat meminta jenis kesalahan Anda untuk menggambarkan dirinya sendiri - sekarang setiap tempat di mana Anda menangani kesalahan dapat menggunakan kode yang sama, dan menangani kemungkinan kasus kesalahan yang akan datang juga.
do {
let sandwich = try makeMeSandwich(kitchen)
print("i eat it \(sandwich)")
} catch let error as SandwichError {
print(error.description)
} catch {
print("i dunno")
}
Ini juga membuka jalan bagi tipe kesalahan (atau ekstensi pada mereka) untuk mendukung cara pelaporan kesalahan lainnya - misalnya, Anda bisa memiliki ekstensi pada jenis kesalahan Anda yang tahu bagaimana menyajikan a UIAlertController
untuk melaporkan kesalahan kepada pengguna iOS.