มีจุดสำคัญสองประการสำหรับโมเดลการจัดการข้อผิดพลาด Swift 2: ความหมดจดและความยืดหยุ่น เมื่อรวมเข้าด้วยกันพวกเขาจะต้มลงไปในdo
/ catch
แถลงการณ์ของคุณซึ่งจำเป็นต้องตรวจสอบข้อผิดพลาดที่เป็นไปได้ทุกอย่าง
โปรดสังเกตว่าคุณไม่ได้ประกาศประเภทของข้อผิดพลาดที่ฟังก์ชั่นสามารถทำได้ มันเป็นปัญหาที่ไม่มีศูนย์เลย: เมื่อมีคนกำหนดฟังก์ชั่นให้ผู้อื่น (รวมถึงตัวเองในอนาคตของคุณ) ให้ใช้คุณไม่ต้องการให้ไคลเอนต์ของฟังก์ชั่นของคุณปรับตัวเข้ากับการเปลี่ยนแปลงทุกอย่างในการนำไปปฏิบัติ ฟังก์ชั่นรวมถึงข้อผิดพลาดที่มันสามารถโยน คุณต้องการโค้ดที่เรียกใช้ฟังก์ชั่นของคุณให้ยืดหยุ่นต่อการเปลี่ยนแปลงดังกล่าว
เนื่องจากฟังก์ชั่นของคุณไม่สามารถบอกได้ว่าเกิดข้อผิดพลาดแบบใด (หรืออาจจะเกิดขึ้นในอนาคต) catch
บล็อกที่ตรวจจับข้อผิดพลาดจะไม่ทราบว่าเกิดข้อผิดพลาดประเภทใด ดังนั้นนอกเหนือจากการจัดการประเภทข้อผิดพลาดที่คุณทราบแล้วคุณจะต้องจัดการกับข้อผิดพลาดที่ไม่ได้มีcatch
คำสั่งที่เป็นสากล- หากฟังก์ชันของคุณเปลี่ยนชุดข้อผิดพลาดที่จะเกิดขึ้นในอนาคตผู้โทรจะยังคงจับ ข้อผิดพลาด
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)
}
แต่อย่าหยุดเพียงแค่นั้น ลองคิดเกี่ยวกับแนวคิดความยืดหยุ่นนี้อีกแล้ว วิธีที่คุณออกแบบแซนวิชคุณต้องอธิบายข้อผิดพลาดในทุก ๆ ที่ที่คุณใช้แซนวิช นั่นหมายความว่าเมื่อใดก็ตามที่คุณเปลี่ยนชุดกรณีความผิดพลาดคุณต้องเปลี่ยนทุกที่ที่ใช้มัน ... ไม่สนุกมาก
แนวคิดเบื้องหลังการกำหนดประเภทข้อผิดพลาดของคุณคือการให้คุณรวมศูนย์สิ่งต่าง ๆ เช่นนั้น คุณสามารถกำหนดdescription
วิธีการสำหรับข้อผิดพลาดของคุณ:
extension SandwichError: CustomStringConvertible {
var description: String {
switch self {
case NotMe: return "Not me error"
case DoItYourself: return "Try sudo"
}
}
}
จากนั้นรหัสการจัดการข้อผิดพลาดของคุณสามารถขอให้ประเภทข้อผิดพลาดของคุณอธิบายตัวเอง - ตอนนี้ทุกที่ที่คุณจัดการข้อผิดพลาดสามารถใช้รหัสเดียวกันและจัดการกรณีข้อผิดพลาดในอนาคตได้เช่นกัน
do {
let sandwich = try makeMeSandwich(kitchen)
print("i eat it \(sandwich)")
} catch let error as SandwichError {
print(error.description)
} catch {
print("i dunno")
}
สิ่งนี้ยังเป็นการปูทางสำหรับประเภทข้อผิดพลาด (หรือส่วนขยาย) เพื่อสนับสนุนวิธีการรายงานข้อผิดพลาดอื่น ๆ - ตัวอย่างเช่นคุณสามารถมีส่วนขยายในประเภทข้อผิดพลาดของคุณที่รู้วิธีการนำเสนอUIAlertController
สำหรับรายงานข้อผิดพลาดแก่ผู้ใช้ iOS