เมื่อโทรฟังก์ชั่นที่มีการประกาศที่มีthrows
ในสวิฟท์, คุณต้องใส่คำอธิบายประกอบเว็บไซต์ฟังก์ชั่นการโทรด้วยหรือtry
try!
ตัวอย่างเช่นกำหนดฟังก์ชั่นการขว้างปา:
func willOnlyThrowIfTrue(value: Bool) throws {
if value { throw someError }
}
ฟังก์ชั่นนี้สามารถเรียกว่าชอบ:
func foo(value: Bool) throws {
try willOnlyThrowIfTrue(value)
}
ที่นี่เราจะอธิบายการโทรด้วยtry
ซึ่งจะเรียกผู้อ่านว่าฟังก์ชั่นนี้อาจเกิดข้อยกเว้นและบรรทัดของรหัสต่อไปนี้อาจไม่ถูกเรียกใช้งาน นอกจากนี้เรายังต้องใส่คำอธิบายประกอบฟังก์ชั่นนี้ด้วยthrows
เพราะฟังก์ชั่นนี้อาจทำให้เกิดข้อยกเว้น (เช่นเมื่อมีการwillOnlyThrowIfTrue()
โยนจากนั้นก็foo
จะ rethrow ข้อยกเว้นขึ้นไปโดยอัตโนมัติ
หากคุณต้องการที่จะเรียกฟังก์ชั่นที่ได้รับการประกาศให้เป็นอาจจะขว้างปา try!
แต่ที่คุณรู้ว่าจะไม่โยนในกรณีของคุณเพราะคุณให้มันเข้าที่ถูกต้องคุณสามารถใช้
func bar() {
try! willOnlyThrowIfTrue(false)
}
วิธีนี้เมื่อคุณรับประกันว่ารหัสจะไม่แสดงคุณไม่จำเป็นต้องใส่รหัสสำเร็จรูปเพิ่มเติมเพื่อปิดใช้งานการเผยแพร่ข้อยกเว้น
try!
มีผลบังคับใช้ขณะใช้งานจริง: หากคุณใช้งานtry!
และฟังก์ชั่นจะจบลงด้วยการโยนการดำเนินการของโปรแกรมของคุณจะถูกยกเลิกด้วยข้อผิดพลาดรันไทม์
รหัสการจัดการข้อยกเว้นส่วนใหญ่ควรมีลักษณะดังนี้: คุณเพียงแค่เผยแพร่ข้อยกเว้นขึ้นเมื่อพวกเขาเกิดขึ้นหรือคุณตั้งค่าเงื่อนไขเช่นนั้นข้อยกเว้นที่เป็นไปได้จะถูกตัดออก การล้างทรัพยากรอื่น ๆ ในรหัสของคุณควรเกิดขึ้นจากการทำลายวัตถุ (เช่นdeinit()
) หรือบางครั้งผ่านdefer
โค้ด ed
func baz(value: Bool) throws {
var filePath = NSBundle.mainBundle().pathForResource("theFile", ofType:"txt")
var data = NSData(contentsOfFile:filePath)
try willOnlyThrowIfTrue(value)
// data and filePath automatically cleaned up, even when an exception occurs.
}
หากมีเหตุผลอะไรก็ตามที่คุณมีรหัสทำความสะอาดที่ต้องทำงาน แต่ไม่ได้อยู่ในฟังก์ชั่นที่คุณสามารถใช้deinit()
defer
func qux(value: Bool) throws {
defer {
print("this code runs when the function exits, even when it exits by an exception")
}
try willOnlyThrowIfTrue(value)
}
รหัสส่วนใหญ่ที่เกี่ยวข้องกับข้อยกเว้นเพียงแค่พวกเขาได้เผยแพร่ขึ้นเพื่อโทรติดต่อทำล้างข้อมูลเกี่ยวกับวิธีการผ่านหรือdeinit()
defer
นี่เป็นเพราะรหัสส่วนใหญ่ไม่รู้ว่าจะทำอย่างไรกับข้อผิดพลาด; มันรู้ว่ามีอะไรผิดพลาด แต่ไม่มีข้อมูลเพียงพอเกี่ยวกับสิ่งที่โค้ดระดับสูงกว่าพยายามทำเพื่อที่จะได้รู้ว่าจะทำอย่างไรกับข้อผิดพลาด ไม่ทราบว่าการนำเสนอกล่องโต้ตอบกับผู้ใช้นั้นเหมาะสมหรือไม่หรือควรลองใหม่อีกครั้งหรือหากมีสิ่งอื่นที่เหมาะสม
อย่างไรก็ตามรหัสระดับที่สูงขึ้นควรรู้ว่าต้องทำอะไรในกรณีที่มีข้อผิดพลาด ดังนั้นข้อยกเว้นอนุญาตให้เกิดข้อผิดพลาดเฉพาะในการทำให้ฟองสบู่เกิดขึ้นจากจุดเริ่มต้นของสิ่งที่สามารถจัดการได้
การจัดการข้อยกเว้นทำได้ผ่านcatch
ข้อความ
func quux(value: Bool) {
do {
try willOnlyThrowIfTrue(value)
} catch {
// handle error
}
}
คุณสามารถมีหลายคำสั่งที่จับได้แต่ละข้อยกเว้นที่แตกต่างกัน
do {
try someFunctionThatThowsDifferentExceptions()
} catch MyErrorType.errorA {
// handle errorA
} catch MyErrorType.errorB {
// handle errorB
} catch {
// handle other errors
}
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการปฏิบัติที่ดีที่สุดมีข้อยกเว้นให้ดูhttp://exceptionsafecode.com/ มันมีจุดประสงค์เฉพาะที่ C ++ แต่หลังจากตรวจสอบโมเดลการยกเว้นของ Swift ฉันเชื่อว่าพื้นฐานนั้นใช้ได้กับ Swift เช่นกัน
สำหรับรายละเอียดเกี่ยวกับไวยากรณ์และการจัดการข้อผิดพลาดรุ่น Swift, ดูหนังสือวิฟท์ Programming Language (สวิฟท์ 2 ก่อนวางจำหน่าย)