1

在我的应用程序中,我可以下载参考数据更新。用户可以在PreferenceActivity- 中修改基本 URL,然后将实际文件名附加到基本 URL。当我尝试下载文件时,如果出现问题,可能会引发异常。我想向用户展示最合适的错误消息,而不是简单地“发生错误”。为此,我想捕获单个异常并相应地格式化消息。那么,下载文件时会抛出哪些异常呢?作为参考,这是我的下载代码(简化):

int msgId;
try {
    String url = props.getProperty(Constants.SETTINGS_REFDATA_SOURCE);
    if(!url.endsWith("/")) {
        url += "/";
    }

    url += Constants.UPDATE_CUSTOMER_FILE;
    CSVReader in = new CSVReader(new InputStreamReader(url.openStream()));

    ...//read and parse file here
}
catch(MalformedURLException e) {
   msgId = R.string.error_invalid_base_url;
}
catch(UnknownHostException e) {
   msgId = R.string.error_unknown_host;
}
catch(FileNotFoundException e) {
   msgId = R.string.error_file_not_found;
}
catch(IOException e) {
   msgId = R.string.error_reading_data;
}
catch(MyParseException e) {
   msgId = R.string.error_invalid_file_format;
}
catch(Exception e) {
   msgId = R.string.error_other_error;
}
finally {
    try { in.close(); } catch(Exception e2) {}
}

// then I display AlertDialog using msgId as the message

正如你所看到的,我已经捕获了几个异常——一些我知道可以抛出,一些是我在测试中遇到的。我还需要满足哪些其他例外情况?请注意,正在下载的数据量非常小(最多 15-20 Kb),因此OutOfMemoryError不应该适用。

4

1 回答 1

0

ConnectException由于连接超时或连接被拒绝(HTTP 403

//编辑:我刚刚读到,“大多数应用程序不应该捕获 ConnectException;捕获超类SocketException更加健壮。”

此外,您可以测试是否有活动的 Internet 连接:

private boolean checkCon() {
    ConnectivityManager conMgr =  (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);

    if ( conMgr.getNetworkInfo(0).getState() == NetworkInfo.State.DISCONNECTED 
        &&  conMgr.getNetworkInfo(1).getState() == NetworkInfo.State.DISCONNECTED) {
      return false;
    }
    return true;
}
于 2013-02-11T12:47:00.437 回答