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. |
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
}

