如何抛出异常并非强制要求捕获

时间:2013-12-27 01:15:06

标签: java exception throw

public class Action {

    public Action(ActionName name) {
        this(name, "");
    }

    public Action(ActionName name, String...args) {
        ...
        act();
    }

    public Action(String url, String paramStr) {
        ...
        act();
    }

    private void act() {
        try {
            response = KanHttpUtil.post(url, paramStr);
        } catch (Exception ex) {
            Log.toConsole(ex.getMessage()); 
            throw ex;  // Actually I can't throw it until I surround it with another try-catch
        }
        ...
    }
}

我有这个动作类。它会经常被调用。如果http帖子有问题我需要抛出异常。但是我不想在每个调用周围编写try-catch,这些调用也不需要捕获异常。 Action总是通过构造方法调用,但是第一种构造方法中的try-catch是不可行的。

现在我很困惑该怎么做。


我想对我的代码进行此更改

throw new RuntimeException();

或者我应该将RuntimeExeption扩展为MyException并抛出它吗?

当我调用Action(ActionName名称)时,我可以抓住它吗?


根据Ben的要求,我将解释该计划的一些细节。 Action中的act()是类中的核心方法,它发布一个http请求并将响应解析到某个级别。我在构造函数中调用它,因为它总是被调用,没有任务返回。相反,我有getResponseCode()getResponseData()来获取信息。我发现打电话很简单int code = new Action(ActionName.A, paramStr).getResponseCode()。因此,如果http发布失败或响应不是预测形式,则会发生失败。

这是KanHttpUtil的源代码

public class KanHttpUtil {

    private static String userAgent = "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36";

    public static String post(String url, String paramStr) throws Exception {
        HttpURLConnection con = null;

        // request
        if (!url.startsWith("http"))
            url = "http://" + Info.getHost() + url;
        if (!paramStr.contains("verno"))
            paramStr = paramStr + "&api_verno=1";
        if (!paramStr.contains("token"))
            paramStr = paramStr + "&api_token=" + Info.getToken();
        try {
            con = (HttpURLConnection) new URL(url).openConnection();
            con.setConnectTimeout(30000);
            con.setReadTimeout(30000); 
            con.setRequestMethod("POST");
            con.setDoOutput(true);
            con.setDoInput(true);
            con.setUseCaches(false);            
            con.setRequestProperty("User-Agent", userAgent);
            con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            OutputStreamWriter osw = new OutputStreamWriter(con.getOutputStream(), "UTF-8");
            osw.write(paramStr.replace("_", "%5F").replace(",", "%2C"));
            osw.flush();
            osw.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (con != null) {
                con.disconnect();
            }
        }

        // response
        StringBuffer buffer = new StringBuffer();
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
            String temp;
            while ((temp = br.readLine()) != null) {
                buffer.append(temp);
                buffer.append("\n");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }    
        return buffer.toString();
    }
}

1 个答案:

答案 0 :(得分:1)

以下是我能想到的两种方式:

  • 考虑一下您想要抛出异常并处理它的位置。您可能希望捕获并将其丢弃在调用层次结构中较低的位置。这种方法的一个很好的场景是,比方说,你是在逐行读取文本文件,如果它是坏的,你想简单地忽略一行(通过对你的用例的'坏'的定义)。在这种情况下,如果您在读者中应用try-catch并在当前行之后立即continue,那将是一个很好的方法。

  • 或者,您可以使用RunTimeException的子类,如果您确定无法保证在发生某些异常时您可以保证做什么。在大多数情况下,使用运行时异常并不是一个好主意。由于这些是未经检查的异常,因此不需要将它们明确地作为合同的一部分进行捕获 - 这可能导致松散的编码实践可能导致系统/服务失效,因为没有计划从内部抛出的异常RuntimeException块。这正是我曾经发生过的事情。

快乐的编码!