Try, Success, Failure
การจัดการข้อยกเว้น
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กลายเป็นNonetoEither: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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Either สำหรับข้อผิดพลาด
- Try, Success, Failure
- การประกอบ Either
- การแปลงระหว่างชนิด