diff --git a/src/completion.rs b/src/completion.rs
index ab7a020..39fe213 100644
--- a/src/completion.rs
+++ b/src/completion.rs
@@ -299,20 +299,30 @@
     };
 
     let mut entries: Vec<Pair> = Vec::new();
-    for entry in try!(dir.read_dir()) {
-        let entry = try!(entry);
-        if let Some(s) = entry.file_name().to_str() {
-            if s.starts_with(file_name) {
-                if let Ok(metadata) = fs::metadata(entry.path()) {
-                    let mut path = String::from(dir_name) + s;
-                    if metadata.is_dir() {
-                        path.push(sep);
+
+    // if dir doesn't exist, then don't offer any completions
+    if !dir.exists() {
+        return Ok(entries);
+    }
+
+    // if any of the below IO operations have errors, just ignore them
+    if let Ok(read_dir) = dir.read_dir() {
+        for entry in read_dir {
+            if let Ok(entry) = entry {
+                if let Some(s) = entry.file_name().to_str() {
+                    if s.starts_with(file_name) {
+                        if let Ok(metadata) = fs::metadata(entry.path()) {
+                            let mut path = String::from(dir_name) + s;
+                            if metadata.is_dir() {
+                                path.push(sep);
+                            }
+                            entries.push(Pair {
+                                display: String::from(s),
+                                replacement: escape(path, esc_char, break_chars, quote),
+                            });
+                        } // else ignore PermissionDenied
                     }
-                    entries.push(Pair {
-                        display: String::from(s),
-                        replacement: escape(path, esc_char, break_chars, quote),
-                    });
-                } // else ignore PermissionDenied
+                }
             }
         }
     }
