Merge "Exception refactoring"
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java b/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java
index 3da670e..ed5f83b 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java
@@ -98,23 +98,32 @@
      * @throw IOException if the provider-returned data could not be read.
      */
     public static List<AssetFileAddress> cacheDictionariesFromContentProvider(final Locale locale,
-            final Context context) throws FileNotFoundException, IOException {
+            final Context context) {
         final ContentResolver resolver = context.getContentResolver();
         final List<String> idList = getDictIdList(locale, context);
         final List<AssetFileAddress> fileAddressList = new ArrayList<AssetFileAddress>();
         for (String id : idList) {
             final Uri wordListUri = getProviderUri(id);
-            final AssetFileDescriptor afd =
-                    resolver.openAssetFileDescriptor(wordListUri, "r");
-            if (null == afd) continue;
-            final String fileName = copyFileTo(afd.createInputStream(),
-                    BinaryDictionaryGetter.getCacheFileName(id, locale, context));
-            afd.close();
-            if (0 >= resolver.delete(wordListUri, null, null)) {
-                // I'd rather not print the word list ID to the log here out of security concerns
-                Log.e(TAG, "Could not have the dictionary pack delete a word list");
+            AssetFileDescriptor afd = null;
+            try {
+                afd = resolver.openAssetFileDescriptor(wordListUri, "r");
+            } catch (FileNotFoundException e) {
+                // leave null inside afd and continue
             }
-            fileAddressList.add(AssetFileAddress.makeFromFileName(fileName));
+            if (null == afd) continue;
+            try {
+                final String fileName = copyFileTo(afd.createInputStream(),
+                        BinaryDictionaryGetter.getCacheFileName(id, locale, context));
+                afd.close();
+                if (0 >= resolver.delete(wordListUri, null, null)) {
+                    // I'd rather not print the word list ID to the log out of security concerns
+                    Log.e(TAG, "Could not have the dictionary pack delete a word list");
+                }
+                fileAddressList.add(AssetFileAddress.makeFromFileName(fileName));
+            } catch (IOException e) {
+                // Can't read the file for some reason. Continue onto the next file.
+                Log.e(TAG, "Cannot read a word list from the dictionary pack : " + e);
+            }
         }
         return fileAddressList;
     }
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java b/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java
index a13e9f2..3af7527 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java
@@ -237,23 +237,16 @@
      */
     public static List<AssetFileAddress> getDictionaryFiles(final Locale locale,
             final Context context, final int fallbackResId) {
-        try {
-            // cacheDictionariesFromContentProvider returns the list of files it copied to local
-            // storage, but we don't really care about what was copied NOW: what we want is the
-            // list of everything we ever cached, so we ignore the return value.
-            BinaryDictionaryFileDumper.cacheDictionariesFromContentProvider(locale, context);
-            List<AssetFileAddress> cachedDictionaryList = getCachedDictionaryList(locale, context);
-            if (null != cachedDictionaryList) {
-                return cachedDictionaryList;
-            }
-            // If the list is null, fall through and return the fallback
-        } catch (FileNotFoundException e) {
-            Log.e(TAG, "Unable to create dictionary file from provider for locale "
-                    + locale.toString() + ": falling back to internal dictionary");
-        } catch (IOException e) {
-            Log.e(TAG, "Unable to read source data for locale "
-                    + locale.toString() + ": falling back to internal dictionary");
+
+        // cacheDictionariesFromContentProvider returns the list of files it copied to local
+        // storage, but we don't really care about what was copied NOW: what we want is the
+        // list of everything we ever cached, so we ignore the return value.
+        BinaryDictionaryFileDumper.cacheDictionariesFromContentProvider(locale, context);
+        List<AssetFileAddress> cachedDictionaryList = getCachedDictionaryList(locale, context);
+        if (null != cachedDictionaryList) {
+            return cachedDictionaryList;
         }
+
         final AssetFileAddress fallbackAsset = loadFallbackResource(context, fallbackResId,
                 locale);
         if (null == fallbackAsset) return null;