diff --git a/pythonetc/README.md b/pythonetc/README.md
index a89d67d..8e35654 100644
--- a/pythonetc/README.md
+++ b/pythonetc/README.md
@@ -89,6 +89,7 @@ More:
1. ./eval-strategy.md
1. ./deepcopy.md
1. ./eval-order.md
+1. ./key-error.md
Out of order:
@@ -122,6 +123,5 @@ Bare except
Value error
Make your own exceptions
When to use is
-Key error message
In uses hash, not eq
sre_parse
diff --git a/pythonetc/key-error.md b/pythonetc/key-error.md
new file mode 100644
index 0000000..40987a0
--- /dev/null
+++ b/pythonetc/key-error.md
@@ -0,0 +1,30 @@
+Most of the standard exceptions raised from the standard library or built-ins have quite descriptive self-contained message:
+
+```python
+try:
+ [][0]
+except IndexError as e:
+ exc = e
+
+str(exc)
+# 'list index out of range'
+```
+
+However, `KeyError` is different: instead of user-friendly error message it contains the key which is missed:
+
+```python
+try:
+ {}[0]
+except KeyError as e:
+ exc = e
+
+# str(exc)
+# '0'
+```
+
+So, if you log an exception as string, make sure you save traceback as well, or at least use `repr` instead of `str`:
+
+```python
+repr(exc)
+# 'KeyError(0)'
+```