มาจัดการ Error ด้วยการ Try -> Catch กันหน่อย

Try catch คืออะไร ?

Piyawut Kamwiset
1 min readNov 23, 2017

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 ดีๆเอาไปประยุกต์ใช้กับโปรเจคที่ตัวเองทำอยู่นะครับ

สามารถดู Code ทั้งหมดได้ในนี้นะครับ

--

--