#428: Don't fail when history is readonly
diff --git a/thefuck/shells.py b/thefuck/shells.py
index 170c2ae10..f78d25755 100644
--- a/thefuck/shells.py
+++ b/thefuck/shells.py
@@ -10,13 +10,14 @@
 import io
 import os
 import shlex
+import sys
 import six
 from .utils import DEVNULL, memoize, cache
 from .conf import settings
+from . import logs
 
 
 class Generic(object):
-
     def get_aliases(self):
         return {}
 
@@ -69,8 +70,8 @@ def get_history(self):
                     lines = lines[-settings.history_limit:]
 
                 for line in lines:
-                    prepared = self._script_from_history(line)\
-                                   .strip()
+                    prepared = self._script_from_history(line) \
+                        .strip()
                     if prepared:
                         yield prepared
 
@@ -117,9 +118,9 @@ def _parse_alias(self, alias):
     def get_aliases(self):
         proc = Popen(['bash', '-ic', 'alias'], stdout=PIPE, stderr=DEVNULL)
         return dict(
-            self._parse_alias(alias)
-            for alias in proc.stdout.read().decode('utf-8').split('\n')
-            if alias and '=' in alias)
+                self._parse_alias(alias)
+                for alias in proc.stdout.read().decode('utf-8').split('\n')
+                if alias and '=' in alias)
 
     def _get_history_file_name(self):
         return os.environ.get("HISTFILE",
@@ -139,7 +140,6 @@ def how_to_configure(self):
 
 
 class Fish(Generic):
-
     def _get_overridden_aliases(self):
         overridden_aliases = os.environ.get('TF_OVERRIDDEN_ALIASES', '').strip()
         if overridden_aliases:
@@ -219,9 +219,9 @@ def _parse_alias(self, alias):
     def get_aliases(self):
         proc = Popen(['zsh', '-ic', 'alias'], stdout=PIPE, stderr=DEVNULL)
         return dict(
-            self._parse_alias(alias)
-            for alias in proc.stdout.read().decode('utf-8').split('\n')
-            if alias and '=' in alias)
+                self._parse_alias(alias)
+                for alias in proc.stdout.read().decode('utf-8').split('\n')
+                if alias and '=' in alias)
 
     def _get_history_file_name(self):
         return os.environ.get("HISTFILE",
@@ -254,9 +254,9 @@ def _parse_alias(self, alias):
     def get_aliases(self):
         proc = Popen(['tcsh', '-ic', 'alias'], stdout=PIPE, stderr=DEVNULL)
         return dict(
-            self._parse_alias(alias)
-            for alias in proc.stdout.read().decode('utf-8').split('\n')
-            if alias and '\t' in alias)
+                self._parse_alias(alias)
+                for alias in proc.stdout.read().decode('utf-8').split('\n')
+                if alias and '\t' in alias)
 
     def _get_history_file_name(self):
         return os.environ.get("HISTFILE",
@@ -303,7 +303,10 @@ def thefuck_alias():
 
 
 def put_to_history(command):
-    return _get_shell().put_to_history(command)
+    try:
+        return _get_shell().put_to_history(command)
+    except IOError:
+        logs.exception("Can't update history", sys.exc_info())
 
 
 def and_(*commands):
