使用tth DefaultHTTPClient时捕获404和500错误

时间:2012-09-09 09:04:47

标签: java android

我正在使用Android中的DefaultHTTPClient来获取网页。我想捕获服务器返回的500和404错误,但我得到的只是java.io.IOException。我怎样才能专门捕获这两个错误?

这是我的代码:

public String doGet(String strUrl, List<NameValuePair> lstParams) throws Exception {

    Integer intTry = 0;

    while (intTry < 3) {

        intTry += 1;

        try {

            String strResponse = null;
            HttpGet htpGet = new HttpGet(strUrl);
            DefaultHttpClient dhcClient = new DefaultHttpClient();
            dhcClient.addResponseInterceptor(new MakeCacheable(), 0);
            HttpResponse resResponse = dhcClient.execute(htpGet);
            strResponse = EntityUtils.toString(resResponse.getEntity());
            return strResponse;

        } catch (Exception e) {

            if (intTry < 3) {
                Log.v("generics.Indexer", String.format("Attempt #%d", intTry));
            } else {                
                throw e;                    
            }

        }

    }

    return null;

}

3 个答案:

答案 0 :(得分:7)

您需要获得statusCode

HttpResponse resResponse = dhcClient.execute(htpGet);
StatusLine statusLine = resResponse.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == HttpURLConnection.HTTP_OK) {
    // Here status code is 200 and you can get normal response
} else {
    // Here status code may be equal to 404, 500 or any other error
}

答案 1 :(得分:2)

您可以使用状态代码比较,如下所示:

StatusLine statusLine = resResponse.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode >= 400 && statusCode < 600) {
    // some handling for 4xx and 5xx errors
} else {
    // when not 4xx or 5xx errors
}

但重要的是你甚至需要消耗HTTPEntity,否则你的连接不会被释放回连接池,这可能导致连接池耗尽。您已经使用toString(entity)执行此操作,但如果您不想使用资源读取不会使用的内容,则可以使用以下指令执行此操作:

EntityUtils.consumeQuietly(resResponse.getEntity())

您可以找到here的文档。

答案 2 :(得分:0)

我用

if (response.getStatusLine().toString().compareTo(getString(R.string.api_status_ok)) == 0)

检查响应代码。一切顺利的话应该是HTTP / 1.1 200 OK。您可以轻松创建一个开关来管理不同的案例。