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