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();
}
}
答案 0 :(得分:1)
以下是我能想到的两种方式:
考虑一下您想要抛出异常并处理它的位置。您可能希望捕获并将其丢弃在调用层次结构中较低的位置。这种方法的一个很好的场景是,比方说,你是在逐行读取文本文件,如果它是坏的,你想简单地忽略一行(通过对你的用例的'坏'的定义)。在这种情况下,如果您在读者中应用try-catch并在当前行之后立即continue
,那将是一个很好的方法。
或者,您可以使用RunTimeException
的子类,如果您确定无法保证在发生某些异常时您可以保证做什么。在大多数情况下,使用运行时异常并不是一个好主意。由于这些是未经检查的异常,因此不需要将它们明确地作为合同的一部分进行捕获 - 这可能导致松散的编码实践可能导致系统/服务失效,因为没有计划从内部抛出的异常RuntimeException块。这正是我曾经发生过的事情。
快乐的编码!