В каких случаях try-catch ловит исключения? - PullRequest
0 голосов
/ 09 июля 2019

Я только начал изучать Scala, так что это может быть простой вопрос.Я хочу использовать блок try-catch, чтобы проверить, была ли объявлена ​​переменная.

Я использую блок try-catch и перехватываю NoSuchElementException, если переменная не существует.

try{
  print(testVariable)
}
catch{
  case e: NoSuchElementException => print("testVariable not found")
}

Мой код показывает ошибку, что testVariable не существует вместо выдачи исключения.Затем я также попробовал несколько других исключений, но, похоже, в Scala try-catch не ловит ни одно из них (за исключением исключения деления на ноль).

Может кто-нибудь подсказать мне, как использовать блок try-catch в Scala?

1 Ответ

8 голосов
/ 09 июля 2019

В Scala (или практически любом скомпилированном языке программирования на самом деле) проверка, объявлена ​​ли переменная или нет, является задачей компилятора, выполняемой во время компиляции.Если вы попытаетесь использовать переменную, которая не была объявлена, компилятор выдаст ошибку, и ваш код не сможет работать.

Исключения - это способ представления проблем во время выполнения.

Нет перекрытия между "временем компиляции" и "временем выполнения", поэтому то, что вы пытаетесь сделать, не делаетимеет смысл. Просто не исключение для "переменная не существует", и поэтому вы не можете ее перехватить.

Для сравнения, возьмите этот пример:

val map = Map('a' -> 1, 'b' -> 2)
map('c') // will throw NoSuchElementException because there is no 'c' in the map

В этом случае map.apply('c') (синтаксический сахар для apply позволяет вам map('c') сгенерирует исключение, потому что именно так реализован метод применения Map. См. определение Map#apply, который вызывает Map # default , если ключ отсутствует на карте; Map#default выдает исключение NoSuchElementException.

Вы можете перехватить это исключение с помощью try / catch,например,

try {
  map('c')
} catch {
   case e: NoSuchElementException =>
     println("got it!")
}
...