Scala for Backend Engineering & Functional Programming · Lekcja

Try, Success, Failure

Obsługa wyjątków

Lekcja 2 z 413 kroki

Try, Success, Failure to bezpłatna lekcja Scala for Backend Engineering & Functional Programming na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Scala for Backend Engineering & Functional Programming, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Scala for Backend Engineering & Functional Programming zawiera 4 lekcji w sumie.

Czym jest Try?

Try[T] reprezentuje obliczenie, które może zakończyć się wartością albo zgłosić wyjątek. Ma dwa podtypy:

  • Success[T] opakowuje zwykły wynik.
  • Failure opakowuje obiekt Throwable.

Zmienia kod zgłaszający wyjątki w wartość, którą można komponować.

Importowanie Try

Try znajduje się w scala.util. Dowolne wyrażenie, które może zgłosić wyjątek, należy umieścić wewnątrz Try { ... }, a konstrukcja ta przechwyci za Państwa wyjątki niefatalne.

import scala.util.Try

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

Success i Failure

Element Try, który kończy się prawidłowo, jest obiektem Success przechowującym wartość; element, który zgłasza wyjątek, staje się obiektem Failure przechowującym ten wyjątek.

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}")
  }
}

Dopasowanie wzorców dla błędów

Gdy opakowany kod zgłosi wyjątek, mogą Państwo sprawdzić wyjątek wewnątrz Failure. W tym przykładzie niepoprawne parsowanie zostaje przechwycone w przejrzysty sposób.

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 z Try

getOrElse zwraca wartość sukcesu albo wartość domyślną, gdy operacja Try się nie powiodła. Dzięki temu można całkowicie uniknąć ponownego zgłaszania wyjątku.

import scala.util.Try

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

map dla Try

map przekształca wartość Success. Jeśli początkowa wartość to Failure albo funkcja mapująca zgłosi wyjątek, wynik nadal pozostaje wartością 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: Obsługa wyjątku

recover pozwala zmienić Failure z powrotem w Success przez obsługę określonych wyjątków za pomocą funkcji częściowej.

import scala.util.Try

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

recoverWith

recoverWith działa podobnie jak recover, ale procedura obsługi zwraca kolejny obiekt Try, a nie zwykłą wartość. Należy użyć go, gdy samo odzyskiwanie może zakończyć się niepowodzeniem.

import scala.util.Try

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

toEither i toOption

Try można łatwo konwertować na inne typy reprezentujące błędy:

  • toOption: Success staje się Some, a Failure staje się None.
  • toEither: Success staje się Right, a Failure staje się 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)
}

Łączenie za pomocą flatMap

flatMap wykonuje sekwencyjnie obliczenia, z których każde zwraca Try. Jeśli dowolny etap się nie powiedzie, cały łańcuch kończy się natychmiast tą wartością 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 a try/catch

Try zamienia wyjątki w wartości, dzięki czemu można używać map, flatMap i łączyć wyniki bez zagnieżdżonych bloków try/catch. Przechwytuje tylko wyjątki niefatalne; poważne błędy, takie jak OutOfMemoryError, nadal są propagowane.

Szybkie sprawdzenie

Sprawdźmy, co wiedzą Państwo o Try.

Podsumowanie

Opanował(a) Pan/Pani obsługę wyjątków za pomocą Try:

  • Try { ... } przechwytuje wyjątki niefatalne jako Failure, a zwykłe wyniki jako Success.
  • Wartości można przekształcać za pomocą map/flatMap, a odzyskiwać za pomocą recover/recoverWith.
  • Wartości domyślne można zapewniać przez getOrElse.
  • Konwersji można dokonywać za pomocą toOption i toEither.
Bezpłatny start

Ucz się Scala dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
39
Lekcje
143

Często zadawane pytania

Czy lekcja „Try, Success, Failure” jest bezpłatna?

Tak — pełny tekst „Try, Success, Failure” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Scala for Backend Engineering & Functional Programming, przejdź na CoddyKit PRO. Kurs Scala for Backend Engineering & Functional Programming zawiera 4 lekcji w sumie.

Co nauczysz się w „Try, Success, Failure”?

Obsługa wyjątków Ćwiczysz Scala for Backend Engineering & Functional Programming z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Scala for Backend Engineering & Functional Programming?

Nie wymagamy żadnego doświadczenia. Scala for Backend Engineering & Functional Programming w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Try, Success, Failure”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Scala for Backend Engineering & Functional Programming?

Tak. Każda lekcja Scala for Backend Engineering & Functional Programming zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Either do obsługi błędów
  2. Try, Success, Failure
  3. Komponowanie Either
  4. Konwersja między typami
← Powrót do Scala for Backend Engineering & Functional Programming