17.2. Wyrzucanie wyjątków

Programy w języku Scala mogą wyrzucać wyjątki. Wyjątki mogą być generowane w programie jawnie, za pomocą wyrażenia throw lub mogą zostać w pewnych sytuacjach wygenerowane przez maszynę wirtualną. Poniższe polecenie ilustruje generację wyjątku jawnie, przy pomocy wyrażenia throw.

scala> throw new Exception("example exception")
java.lang.Exception: example exception
  ... 33 elided

Argumentem instrukcji throw musi być instancja klasy java.lang.Throwable lub jakiejś jej podklasy. Próba użycia innego rodzaju obiektu powoduje błąd kompilacji, jak w poniższym przykładzie.

scala> throw "Hello"
<console>:11: error: type mismatch;
 found   : String("Hello")
 required: Throwable
       throw "Hello"
             ^

Jeśli wyrażenie znajdujące się po słowie throw ewaluowane jest do wartości null, to w rezultacie zostaje wygenerowany wyjątek java.lang.NullPointerException.

scala> throw null
java.lang.NullPointerException
  ... 33 elided

Zdefiniowana w pliku Throw1.scala metoda greet_! zawiera wyrażenia throw wyrzucające wyjątek. W przypadku, gdy zostanie wykonane jedno z nich, wykonanie metody zatrzymuje się na nim i skutkuje wyrzuceniem wyjątku na zewnątrz metody.

Plik Throw1.scala:
def greet_!(greeting: String, n: Int):String = {
  if (n == 0) throw new RuntimeException("No greeting")
  if (n < 0) throw new IllegalArgumentException("The number must be positive.")
  if (n > 5) throw new Exception("Number too big: "+n)
  greeting + "!" * n
}

Poniższe polecenia ilustrują działanie metody greet_!.

scala> :load Throw1.scala
Loading Throw1.scala...
greet_$bang: (greeting: String, n: Int)String

scala> greet_!("Hello",-1)
java.lang.IllegalArgumentException: The number must be positive.
  at .greet_$bang(<console>:12)
  ... 33 elided

scala> greet_!("Hello",0)
java.lang.RuntimeException: No greeting
  at .greet_$bang(<console>:11)
  ... 33 elided

scala> greet_!("Hello",4)
res5: String = Hello!!!!

scala> greet_!("Hello",7)
java.lang.Exception: Number too big: 7
  at .greet_$bang(<console>:13)
  ... 33 elided

Wyjątki mogą zostać wygenerowane nie tylko w sposób jawny — za pomocą wyrażenia throw — ale mogą również w pewnych sytuacjach zostać wygenerowane przez maszynę wirtualną. Jedną z takich sytuacji jest dzielenie liczby całkowitej przez zero. Próba ewaluacji poniższego wyrażenia kończy się wygenerowaniem wyjątku.

scala> 1/0
java.lang.ArithmeticException: / by zero
  ... 33 elided

Specyfikacja języka Scala opisuje wyrażenie throw w punkcie 6.21.

Język programowania Scala Wydanie 2. Copyright © Grzegorz Balcerek 2016

Licencja Creative Commons

Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowe.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.