Mejor práctica: capturar puntos de falla en java.net.URL

Nuevo en JVM, trabajando con Scala y Play 2.0

Estoy convirtiendo una aplicación heredada en Play, una que requiere procesamiento de pagos a través de Authorize.net. Mirando a través de la fuente java.net.URL, hay numerosos puntos potenciales de falla. Dada la interfaz que he escrito a continuación, ¿dónde implementaría los bloques try / catch? Tendré que adaptar las firmas de método en consecuencia, probablemente devolviendo un [Error, Éxito] a llamar al código del cliente

import java.net.{URL, URLEncoder}
import java.io.{BufferedReader, DataOutputStream, InputStreamReader}
import javax.net.ssl._

trait Authnet {
  private val prodUrl = "https://secure.authorize.net/gateway/transact.dll"
  private val testUrl = "https://test.authorize.net/gateway/transact.dll"

  protected def authNetProcess(params: Map[String,String]) = {
    val(conn, urlParams) = connect(params)
    val request = new DataOutputStream( conn.getOutputStream )
    request.write(urlParams.getBytes)
    request.flush()
    request.close()
    val response = new BufferedReader(new InputStreamReader(conn.getInputStream))
    val results = response.readLine().split("\\|")
    response.close()
    results.toList
  }  

  private def connect(params: Map[String,String]) = {
    val urlParams = (config ++ params) map { case(k,v) =>
        URLEncoder.encode(k, "UTF-8") + "=" + URLEncoder.encode(v, "UTF-8")
    } mkString("&")

    lazy val url = if (isDev) new URL(testUrl) else new URL(prodUrl)
    val conn = url.openConnection
    conn.setDoOutput(true)
    conn.setUseCaches(false)
    (conn, urlParams)
  }

  private val config = Map(
    'x_login        -> "...",
    'x_tran_key     -> "...",
    ...
  )
}
Respuesta 1

Cumplir con la regla del pulgar:

Solo atrape una excepción si debe manejarla.

No existe una definición precisa para "debe manejar", pero significa que debe resistir el impulso de detectar una excepción porque puede lanzar una excepción diferente.

El "debe manejar" se define principalmente por cómo debería funcionar su aplicación u otras dependencias.

Si la aplicación requiere mostrar un error al usuario en lugar de abortar con una excepción, entonces es imprescindible.

En ese caso, la captura de la excpección agrega también un procesamiento significativo.

Si una API requiere lanzar una excepción diferente, entonces es imprescindible, pero la definición de API posiblemente no sea sólida.

Siempre estoy cuestionando el valor agregado de reemplazar una excepción con solo otra excepción.

Aplicando esto a su ejemplo:

¿Agregaría algún valor para detectar una excepción de connect () en authNetProcess ()?

¡No! No hay forma de manejar esa excepción dentro de connect (). Entonces está bien dejar esa excepción a la persona que llama de authNetProcess. Allí podría proporcionar un manejo diferente según el tipo de excepción.

Respuesta: 2

Tengo un problema cuando obtengo un objeto de hibernación. El stacktrace es: org.hibernate.InstantiationException: No se pudo crear una instancia de la entidad: main.java.com.gwt.app.server.User en org.hibernate.tuple ...

Estoy usando este código para obtener el tipo de archivo: FileSystemView filesystem = FileSystemView.getFileSystemView (); String sFileType = filesystem.getSystemTypeDescription (archivo)) En Windows, este código ...

Quiero generar números aleatorios, pero no quiero que sean de la matriz de exclusión. Aquí está mi código. public int generateRandom (int start, int end, ArrayList <Integer> exclude) {Random rand = ...

Tengo la siguiente situación: taglib.jar: un taglib JSP personalizado empaquetado como un archivo JAR. El archivo TLD es /META-INF/taglib.tld. webapp.war: una aplicación web con archivos JSP que usan las etiquetas proporcionadas ...