最佳做法:捕获java.net.URL中的失败点

使用 Scala和Play 2.0进行JVM的新功能

我将遗留应用程序转换为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     -> "...",...
  )
}

解决方法

坚持拇指规则:

Only catch an exception if you must handle it.

“必须处理”没有清晰的定义,但这意味着你应该抵制一个异常的冲动,因为你只能抛出一个异常.

“必须处理”主要由应用程序应该如何工作或其他依赖关系定义.

If the application requires to display an error to the user instead of aborting with an exception,then it’s a must.

在这种情况下,抓住这一点也增加了一些有意义的处理.

If an API requires to throw a different exception,then it’s a must,but the APIs definition is possibly not sound.

我总是质疑用另外一个异常替换异常的附加值.

将其应用于您的示例:

Would it add some value to catch an exception from connect() in authNetProcess()?

没有!没有办法在connect()中处理这个异常.所以它可以将该异常留给authNetProcess的调用者.在那里,您可以根据异常的类型提供不同的处理.

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写: 一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...