vir*_*yes 10 java io error-handling scala playframework-2.0
JVM的新手,使用Scala和Play 2.0
我正在将遗留应用程序转换为Play,这需要通过Authorize.net进行付款处理.通过java.net.URL源查看,有许多潜在的失败点.鉴于我在下面写的接口,你会在哪里实现try/catch块?我需要相应地调整方法签名,可能会将[错误,成功]返回到调用客户端代码
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 -> "...",
...
)
}
Run Code Online (Sandbox Code Playgroud)
编辑
好吧,如果连接/流过程的任何部分失败,事务就会被破坏,所以愚蠢地只捕获打开连接时的错误。我只是将整个交易包装在一个catching (operation) option块中,然后就这样;我不太关心错误的确切原因(无论记录的是什么),因为它是暂时的,所以捕获它,让用户重试;如果错误仍然存在,请联系我们...
好吧 ,考虑到迄今为止的赞成票和缺乏评论,我能得出的唯一结论是……这里没有人知道他们在做什么!呵呵,开玩笑的;-)
虽然我是 JVM 的新手,但 try/catch/finally 的膨胀很快就变得老旧了;通过 Scala 类型推断的奇迹,我将一般错误处理抽象为简洁的实现:
catching ( operation ) option
catching ( operation ) either
除非我收到其他反馈,否则现在我只是通过捕获连接创建来应对(我相信,在这种情况下,最有可能的错误情况)。这是新的实现:
protected def authNetProcess(params: Map[String,String]) = {
connect() match {
case Some(conn) =>
val request = new DataOutputStream(conn.getOutputStream)
request.write(getUrlParams(params).getBytes)
request.flush()
request.close()
val response = new BufferedReader(new InputStreamReader(conn.getInputStream))
val results = response.readLine().split("\\|")
response.close()
results.toList
case None => List[String]()
}
}
private def connect() = {
lazy val url = if (isDev) new URL(testUrl) else new URL(prodUrl)
catching ( url.openConnection ) option match {
case Some(conn) =>
conn.setDoOutput(true)
conn.setUseCaches(false)
//conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded")
Some(conn)
case None => None // connection failed
}
}
Run Code Online (Sandbox Code Playgroud)
我认为更严格的方法是将所有潜在的错误条件提取到 MaybeWorked Option 操作中,然后将它们全部包装在 for 理解中。这可能是正确/负责任的方法......但一天只有这么多小时,稍后会重新审视这一点
感谢反馈!