มาจัดการ Error ด้วยการ Try -> Catch กันหน่อย
Try catch คืออะไร ?
Try Catch มันเป็นการทำนายว่าแอพพลิเคชั่นของเรามันจะเกิด Error อะไรขึ้นมาได้บ้างหรือ Error ที่เราคาดไม่ถึงและมันทำให้แอพพลิเคชั่นของเราหยุดการทำงานลง ซึ่งเหตุการณ์แบบนี้ไม่ควรจะเกิดขึ้นกับแอพพลิเคชั่นที่ Release ไปแล้ว แต่ถ้ามันเกิด Error ขึ้นมาแล้วเราจะมีวิธีการจัดการกับ Error นั้นอย่างไร
ดังนั้นก่อนที่เราจะเริ่มทำ Try Catch เราจะต้องมาคิดและวิเคราะห์หาความเสี่ยงที่อาจจะก่อให้เกิดความผิดพลาดของระบบแล้วทำให้มันเป็นสาเหตุของ App Crash
Representing Errors
Representing Errors คือการที่เราคิดและออกแบบมาแล้วว่า Code ที่เราเขียนนั้นมีโอกาสที่จะเกิด error อะไรขึ้นได้ < แต่มันก็ยังมีโอกาสที่เกิดได้มากกว่าที่เราคิดนะ >
ยกตัวอย่างเช่นเราจะเขียน Plus Function (การบวกเลข) สิ่งที่เราต้องทำขั้นแรกคือคิดว่ามันจะที่เคสไหนที่อาจจะทำให้เกิด Error ขึ้นได้
- Input ต้องมีค่านะ ( ไม่ใช่ String ว่าง)
- Input ต้องเป็นตัวเลขนะ
ขั้นตอนต่อมาเลยคือเมื่อเราคิดแล้วว่า Error ที่อาจเกิดขึ้นนั้นมีอะไรบ้าง เราก็จะมาทำการประกาศ Error นั้นกัน ด้วยการใช้ Enum ที่สืบทอดมาจาก Error class
enum CalculateError: Error {case stringEmptycase invalidNumber}
Handling Errors
เมื่อเรารู้และได้ประกาศ Error ต่างๆที่สามารถเกิดได้แล้ว ต่อมาเราก็ต้องมาบริหารจัดการ Code ที่มีโอกาศจะเกิด Error ขึ้น
ขั้นแรกเราต้องรู้ว่า Function ไหนของเราที่มีโอกาสเกิด Error เมื่อเรารู้แล้วเราก็จะใช้คำสั่ง throws หลัง Function นั้นเพื่อเป็นการบอกว่า Function นี้มีการใช้ Try Catch ด้วยนะ
func plusFunction(firstInput: String , secondInput: String) throws -> Int {}
ขั้นที่สองเราต้องมาเขียนดัก Error ว่าถ้ามันทำงานผิดพลาดแบบนี้ Error ที่โยนออกไปนั้นมันควรจะเป็น Error อะไร (เราจะมาโยน Error มั่วๆออกไปไม่ได้ เพราะว่าอีกส่วนการทำงานของเราอาจจะต้องเอา Error ที่เราโยนออกไป นำไปใช้ต่อไม่ว่าจะเป็นการขึ้น Alert หรืออะไรก็ตาม )
func plusFunction(firstInput: String , secondInput: String) throws -> Int { if firstInput == "" || secondInput == "" { throw CalculateError.stringEmpty } let numberFirstInput: Int? = Int(firstInput) ?? nil let numberSecondInput: Int? = Int(secondInput) ?? nil if numberFirstInput == nil || numberSecondInput == nil { throw CalculateError.invalidNumber } return numberFirstInput! + numberSecondInput!}
Using Do-Catch
ขั้นสุดท้ายเมื่อ Code ได้มีการเรียกใช้ Function ที่มีการ Throws Error ออกมา ใน Code ส่วนที่เรียกใช้ก็ต้องมีการดักว่า Function ที่ไปเรียกมันมานั้นมันเกิด Error ขึ้นมาไหม
โดยเราจะใช้คำสั่ง Do เพื่อจะบอกว่า Code ตรงส่วนที่อยู่ใน Do อาจจะมี Error เกิดขึ้นได้
do {
let result: Int? = try
calculatePresenter?.plusFunction(firstInput: firstInput!,
secondInput: secondInput!) lblResult.text = "Result is \(result!)"
}
ต่อมาคือใช้ try เพื่อบอกว่า Function นิแหละที่มีโอกาสเกิด Error นะ
try calculatePresenter?.plusFunction(firstInput: firstInput!,
secondInput: secondInput!)
อันสุดท้ายคือ catch เพื่อบอกว่า Error ที่เกิดขึ้นตรงกับ case ไหน เพื่อสั่งให้มันเข้ามาทำงานเมื่อเกิด Error ขึ้นมา
catch CalculateError.stringEmpty {
print("string is empty")
}
หวังว่าตัวอย่างการใช้ Try Catch ที่ยกมานี้จะให้ทำหลายท่านมี ideal ดีๆเอาไปประยุกต์ใช้กับโปรเจคที่ตัวเองทำอยู่นะครับ