Структура кода, необходимая для перехвата исключений из CloseableHttpClient.execute()

#java #scala #apache-httpclient-4.x

#java #scala #apache-httpclient-4.x

Вопрос:

Учитывая,

 val request: HttpPost = new HttpPost(url)
val response: CloseableHttpResponse = client.execute(request)
 

Как мне упорядочить их с помощью блоков try catch, чтобы я мог правильно перехватывать исключения?

Здесь говорится, что execute() может генерироваться 2 исключения, поэтому я попытался сделать

 val client: CloseableHttpClient = HttpClientBuilder.create().build()
    try{
      val response: CloseableHttpResponse = client.execute(request)
    }catch {
      case ClientProtocolException => println("Excepton1")
      case IOException => println("Exception2")
    }finally {
      response.close()
      client.close()
    }
 

но это недопустимо, поскольку response не разрешено в finally блоке с момента его объявления try .

Любое решение, которое не заставляет меня использовать var ?

Спасибо за помощь.

Ответ №1:

Я предполагаю, что вы ищете что-то похожее на try-with-resources из java, в scala, который вы можете использовать scala.util.Using . Вот пример использования для вашего случая

   val url = ""
  val request: HttpPost = new HttpPost(url)

  Using.Manager { use =>
    val client: CloseableHttpClient = use(HttpClientBuilder.create().build())
    val response: CloseableHttpResponse = use(client.execute(request))
  }.recover {
    case ClientProtocolException => println("Excepton1")
    case IOException => println("Exception2")
  }
 

Ответ №2:

Блок catch может назвать исключение, которое он улавливает, как в

catch (SQLException e) { …. }

Таким образом, у вас может быть несколько блоков catch, адресующих разные исключения.

Комментарии:

1. за исключением того , что это было бы написано catch { case e: SQLException => ... } .