Try, Success, Failure
Obsługa wyjątków
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.Failureopakowuje obiektThrowable.
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:Successstaje sięSome, aFailurestaje sięNone.toEither:Successstaje sięRight, aFailurestaje 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 jakoFailure, a zwykłe wyniki jakoSuccess.- 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ą
toOptionitoEither.
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
- Either do obsługi błędów
- Try, Success, Failure
- Komponowanie Either
- Konwersja między typami