Scala for Backend Engineering & Functional Programming · บทเรียน

Try, Success, Failure

การจัดการข้อยกเว้น

บทเรียน 2 จาก 413 ขั้นตอน

Try, Success, Failure เป็นบทเรียน Scala for Backend Engineering & Functional Programming ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Scala for Backend Engineering & Functional Programming และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน

Try คืออะไร

Try[T] ใช้แทนการคำนวณที่อาจได้ค่าเป็นผลลัพธ์หรือโยนข้อยกเว้น มีชนิดย่อยสองชนิด:

  • Success[T] ห่อหุ้มผลลัพธ์ปกติ
  • Failure ห่อหุ้ม Throwable

สิ่งนี้เปลี่ยนโค้ดที่โยนข้อยกเว้นให้เป็นค่าที่คุณนำไปประกอบต่อได้

การนำเข้า Try

Try อยู่ใน scala.util คุณสามารถห่อหุ้ม expression ใด ๆ ที่อาจโยนข้อยกเว้นไว้ภายใน Try { ... } แล้วให้ระบบดักจับข้อยกเว้นที่ไม่ร้ายแรงให้

import scala.util.Try

@main def run(): Unit = {
  val ok = Try(10 / 2)
  val bad = Try(10 / 0)
  println(ok)
  println(bad)
}

Success และ Failure

Try ที่ทำงานเสร็จตามปกติจะเป็น Success ซึ่งเก็บค่าไว้ ส่วนรายการที่โยนข้อยกเว้นจะกลายเป็น Failure ซึ่งเก็บข้อยกเว้นนั้นไว้

import scala.util.{Try, Success, Failure}

@main def run(): Unit = {
  val result = Try("123".toInt)
  result match {
    case Success(n) => println(s"parsed: $n")
    case Failure(e) => println(s"failed: ${e.getMessage}")
  }
}

การจับคู่รูปแบบกับความล้มเหลว

เมื่อโค้ดที่ห่อหุ้มไว้โยนข้อยกเว้น คุณสามารถตรวจสอบข้อยกเว้นภายใน Failure ได้ ในตัวอย่างนี้ การแปลงข้อมูลที่ไม่ถูกต้องถูกจัดการไว้อย่างเรียบร้อย

import scala.util.{Try, Success, Failure}

@main def run(): Unit = {
  val result = Try("abc".toInt)
  result match {
    case Success(n) => println(s"got $n")
    case Failure(e) => println(s"error type: ${e.getClass.getSimpleName}")
  }
}

getOrElse กับ Try

getOrElse คืนค่าที่สำเร็จ หรือคืนค่าเริ่มต้นเมื่อ Try ล้มเหลว วิธีนี้ช่วยหลีกเลี่ยงการโยนข้อยกเว้นได้ทั้งหมด

import scala.util.Try

@main def run(): Unit = {
  val n = Try("oops".toInt).getOrElse(-1)
  println(n)
}

map บน Try

map แปลงค่าใน Success หากค่าเดิมเป็น Failure หรือฟังก์ชันที่ใช้แปลงโยนข้อยกเว้น ผลลัพธ์จะยังคงเป็น Failure

import scala.util.Try

@main def run(): Unit = {
  val doubled = Try("21".toInt).map(_ * 2)
  val failed  = Try("x".toInt).map(_ * 2)
  println(doubled)
  println(failed)
}

recover: จัดการข้อยกเว้น

recover ช่วยเปลี่ยน Failure กลับเป็น Success โดยจัดการข้อยกเว้นเฉพาะที่กำหนดด้วยฟังก์ชันบางส่วน

import scala.util.Try

@main def run(): Unit = {
  val safe = Try("x".toInt).recover {
    case _: NumberFormatException => 0
  }
  println(safe)
}

recoverWith

recoverWith คล้ายกับ recover แต่ตัวจัดการจะคืนค่าเป็น Try อีกรายการแทนค่าทั่วไป ใช้เมื่อการกู้คืนเองก็อาจล้มเหลวได้

import scala.util.Try

@main def run(): Unit = {
  val result = Try("x".toInt).recoverWith {
    case _: NumberFormatException => Try("42".toInt)
  }
  println(result)
}

toEither และ toOption

Try สามารถแปลงเป็นชนิดข้อมูลสำหรับข้อผิดพลาดแบบอื่นได้อย่างสะดวก:

  • toOption: Success กลายเป็น Some และ Failure กลายเป็น None
  • toEither: Success กลายเป็น Right และ Failure กลายเป็น Left(throwable)
import scala.util.Try

@main def run(): Unit = {
  println(Try("5".toInt).toOption)
  println(Try("x".toInt).toOption)
  println(Try("5".toInt).toEither.isRight)
}

การต่อด้วย flatMap

flatMap เรียงการคำนวณที่แต่ละรายการคืนค่าเป็น Try หากขั้นตอนใดล้มเหลว การต่อทั้งหมดจะหยุดทันทีและคืนค่า Failure นั้น

import scala.util.Try

object Main {
  def half(n: Int): Try[Int] = Try(if (n % 2 == 0) n / 2 else throw new RuntimeException("odd"))

  def main(args: Array[String]): Unit = {
    println(Try("8".toInt).flatMap(half))
    println(Try("7".toInt).flatMap(half))
  }
}

Try เทียบกับ try/catch

Try เปลี่ยนข้อยกเว้นให้เป็น ค่า คุณจึงใช้ map, flatMap และรวมผลลัพธ์ได้โดยไม่ต้องซ้อนบล็อก try/catch โดยจะดักจับเฉพาะข้อยกเว้นที่ ไม่ร้ายแรง เท่านั้น ส่วนข้อผิดพลาดร้ายแรงอย่าง OutOfMemoryError ยังคงถูกส่งต่อไป

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความรู้ของคุณเกี่ยวกับ Try

สรุปทบทวน

คุณได้เรียนรู้การจัดการข้อยกเว้นด้วย Try แล้ว:

  • Try { ... } จับข้อยกเว้นที่ไม่ร้ายแรงเป็น Failure และผลลัพธ์ปกติเป็น Success
  • แปลงค่าด้วย map/flatMap และกู้คืนด้วย recover/recoverWith
  • กำหนดค่าเริ่มต้นด้วย getOrElse
  • แปลงด้วย toOption และ toEither
เริ่มต้นได้ฟรี

เรียนรู้ Scala ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
39
บทเรียน
143

คำถามที่พบบ่อย

บทเรียน “Try, Success, Failure” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “Try, Success, Failure” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Scala for Backend Engineering & Functional Programming ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “Try, Success, Failure”

การจัดการข้อยกเว้น คุณปฏิบัติ Scala for Backend Engineering & Functional Programming ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Scala for Backend Engineering & Functional Programming หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Scala for Backend Engineering & Functional Programming บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “Try, Success, Failure” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Scala for Backend Engineering & Functional Programming นี้ได้ไหม

ได้ บทเรียน Scala for Backend Engineering & Functional Programming ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. Either สำหรับข้อผิดพลาด
  2. Try, Success, Failure
  3. การประกอบ Either
  4. การแปลงระหว่างชนิด
← กลับไปที่ Scala for Backend Engineering & Functional Programming