diff --git a/src/pygit2/tree.c b/src/pygit2/tree.c
index d6cc580..0cf9299 100644
--- a/src/pygit2/tree.c
+++ b/src/pygit2/tree.c
@@ -239,6 +239,7 @@ Tree_getitem(Tree *self, PyObject *value)
 {
     char *name;
     const git_tree_entry *entry;
+    int err;
 
     /* Case 1: integer */
     if (PyInt_Check(value))
@@ -251,13 +252,19 @@ Tree_getitem(Tree *self, PyObject *value)
     
     if (strchr(name, '/') != NULL) {
         /* Case 2a: path string */
-        git_tree_entry_bypath(&entry, self->tree, name);
+        err = git_tree_entry_bypath(&entry, self->tree, name);
+        if (err == GIT_ENOTFOUND)
+            entry = NULL;
+        else if (err < 0)
+            return Error_set(err);
+
     } else {
         /* Case 2b: base name */
         entry = git_tree_entry_byname(self->tree, name);
     }
 
     free(name);
+
     if (!entry) {
         PyErr_SetObject(PyExc_KeyError, value);
         return NULL;
diff --git a/test/test_tree.py b/test/test_tree.py
index 0f70644..44e85c6 100644
--- a/test/test_tree.py
+++ b/test/test_tree.py
@@ -70,6 +70,7 @@ class TreeTest(utils.BareRepoTestCase):
 
         sha = '297efb891a47de80be0cfe9c639e4b8c9b450989'
         self.assertTreeEntryEqual(tree['c/d'], sha, 'd', 0o0100644)
+        self.assertRaisesWithArg(KeyError, 'ab/cd', lambda: tree['ab/cd'])
 
     def test_read_subtree(self):
         tree = self.repo[TREE_SHA]