17.3. Wyrażenie try
Pojawienie się wyjątku podczas wykonywania metody lub funkcji nie musi skutkować natychmiastowym zakończeniem działania tej metody lub funkcji. Wyjątek może być obsłużony w wyrażeniu try. Wyrażenie to składa się ze słowa kluczowego try, po którym występuje wyrażenie, a po nim mogą wystąpić klauzule catch i/lub finally. Sposób wykonania wyrażenia try zależy od tego, w jaki sposób zakończy się wykonywanie wyrażenia znajdującego się po słowie kluczowym try oraz od obecności i treści opcjonalnych klauzul catch i finally.
Specyfikacja języka Scala opisuje wyrażenie try w punkcie 6.22. |
Wyrażenie try, w którym nie ma ani klauzuli catch, ani klauzuli finally, wykonuje się tak, jakby wyrażenie występujące po słowie kluczowym try nie było nim poprzedzone. Choć taki sposób użycia wyrażenia try jest dozwolony, to jego sens jest wątpliwy. Kompilator informuje o tym za pomocą ostrzeżenia.
Plik Try1.scala: def tt1:Int = 1 def tt2:Int = try 1 def te1:Int = throw new Exception def te2:Int = try throw new Exception
W poniższych przykładach, zdefiniowana w pliku Try1.scala metoda tt1, zachowuje się tak, jak tt2 (obie zwracają w wyniku 1). To samo dotyczy metod te1 i te2 (obie zgłaszają wyjątek). Definicje metod tt2 oraz te2 powodują wystąpienie ostrzeżeń kompilacji.
scala> :load Try1.scala Loading Try1.scala... tt1: Int <console>:10: warning: A try without a catch or finally is equivalent to putting its body in a block; no exceptions are handled. def tt2:Int = try 1 ^ tt2: Int te1: Int <console>:10: warning: A try without a catch or finally is equivalent to putting its body in a block; no exceptions are handled. def te2:Int = try throw new Exception ^ te2: Int scala> tt1 res0: Int = 1 scala> tt2 res1: Int = 1
scala> te1 java.lang.Exception at .te1(<console>:10) ... 33 elided scala> te2 java.lang.Exception at .te2(<console>:10) ... 33 elided