Шаблон, сопоставляющий неисключительное значение с использованием выражения try-catch - PullRequest
0 голосов
/ 19 февраля 2020

У меня вопрос по поводу блока try catch. Вот пример:

val num = try {
  110 / 12
} catch {
  case ex: NumberFormatException => 0
}

val num1 = try {
  110 / 13
} catch {
  case a: num1 > 10 => 10
  case b: num1 < 10 => 12
}

Я знаю, num работает, так почему num1 недействительно? Все примеры и статьи, которые я видел, делают только NumberFormatException или ArithmenticException. И также больше и меньше, чем недопустимые операторы в операторе case? Можно ли трактовать блок try catch как блок if else, используя сопоставление с образцом?

Ответы [ 2 ]

4 голосов
/ 19 февраля 2020

Полагаю, вы пытаетесь написать что-то вроде

try {
  110 / 13
} catch {
  case a if a > 10 => 10
  case b if b < 10 => 12
}

, однако это недопустимый синтаксис, поскольку выражение try имеет форму

try { b } catch h

где обработчик h должен быть частичной функцией типа

PartialFunction[Throwable, T]

, поэтому a в case a if a > 10 должен быть Throwable, однако Throwable не имеет метода >, определенного для него.


Рассмотрим обработку ошибок monadi c с использованием Try вместо выражения try-catch. Это позволит вам просто map закончить в счастливом случае. Например, рассмотрим

Try(110 / 13)
  .map(num => if (num > 10) 10 else 12)
  .getOrElse(someDefaultValue)

Обработка ошибок без исключений содержит некоторые интерактивные упражнения, которые помогут вам начать работу с концепцией.

1 голос
/ 19 февраля 2020

Дополнение другого ответа, если вам не терпится привести в порядок список дел:

scala> import util._
import util._

scala> Try(1/0) match {
     | case Success(i) if i > 42            => 42
     | case ok @ Success(_)                 => ok
     | case Failure(_: ArithmeticException) => 27
     | }
res0: Int = 27

...