diff --git a/Android.mk b/Android.mk
index 9da2083..9d5fc12 100644
--- a/Android.mk
+++ b/Android.mk
@@ -16,11 +16,9 @@ LOCAL_PATH := $(call my-dir)
 
 include $(CLEAR_VARS)
 
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/lib/marisa
-LOCAL_CFLAGS += -fexceptions
-LOCAL_CPP_EXTENSION := .cc
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/lib/marisa external/stlport
 
-LOCAL_NDK_STL_VARIANT := gnustl_static
+LOCAL_CPP_EXTENSION := .cc
 
 LOCAL_SRC_FILES := lib/marisa/base.cc \
 	lib/marisa/intvector.cc \
@@ -36,7 +34,7 @@ LOCAL_SRC_FILES := lib/marisa/base.cc \
 	lib/marisa/writer.cc
 
 LOCAL_MODULE := libmarisa-trie
+LOCAL_MODULE_TAGS := optional
 
-LOCAL_SDK_VERSION := 14
-
+include external/stlport/libstlport.mk
 include $(BUILD_STATIC_LIBRARY)
diff --git a/lib/marisa/base.h b/lib/marisa/base.h
index c2b2b07..731b24a 100644
--- a/lib/marisa/base.h
+++ b/lib/marisa/base.h
@@ -13,6 +13,10 @@
 #include <stddef.h>
 #endif  // __cplusplus
 
+#if defined(__ANDROID__)
+#include <android/log.h>
+#endif  // __ANDROID__
+
 #ifdef __cplusplus
 extern "C" {
 #endif  // __cplusplus
@@ -183,8 +187,22 @@ class Exception {
 };
 
 // MARISA_THROW adds a filename and a line number to an exception.
+#if !defined(__ANDROID__)
 #define MARISA_THROW(status) \
   (throw Exception(__FILE__, __LINE__, status))
+#else
+
+inline int android_log_exception(int status) {
+  char tmpbuf[100];
+  snprintf(tmpbuf, sizeof(tmpbuf), "marisa exception: %d", status);
+  __android_log_write(ANDROID_LOG_ERROR, "marisa-trie", tmpbuf);
+  return 0;
+}
+
+#define MARISA_THROW(status) \
+  (android_log_exception(status))
+
+#endif  // __ANDROID__
 
 // MARISA_THROW_IF throws an exception with `status' if `cond' is true.
 #define MARISA_THROW_IF(cond, status) \
diff --git a/lib/marisa/reader.cc b/lib/marisa/reader.cc
index 6ecc797..df144ef 100644
--- a/lib/marisa/reader.cc
+++ b/lib/marisa/reader.cc
@@ -80,11 +80,7 @@ void Reader::read_data(void *buf, std::size_t size) {
       MARISA_THROW(MARISA_IO_ERROR);
     }
   } else if (stream_ != NULL) {
-    try {
-      if (!stream_->read(static_cast<char *>(buf), size)) {
-        MARISA_THROW(MARISA_IO_ERROR);
-      }
-    } catch (const std::ios_base::failure &) {
+    if (!stream_->read(static_cast<char *>(buf), size)) {
       MARISA_THROW(MARISA_IO_ERROR);
     }
   } else {
diff --git a/lib/marisa/trie-build.cc b/lib/marisa/trie-build.cc
index 4421432..fb7f072 100644
--- a/lib/marisa/trie-build.cc
+++ b/lib/marisa/trie-build.cc
@@ -63,15 +63,9 @@ void Trie::build_trie(Vector<Key<String> > &keys,
     build_trie(keys, static_cast<UInt32 *>(NULL), flags);
     return;
   }
-  try {
-    std::vector<UInt32> temp_key_ids(keys.size());
-    build_trie(keys, temp_key_ids.empty() ? NULL : &temp_key_ids[0], flags);
-    key_ids->swap(temp_key_ids);
-  } catch (const std::bad_alloc &) {
-    MARISA_THROW(MARISA_MEMORY_ERROR);
-  } catch (const std::length_error &) {
-    MARISA_THROW(MARISA_SIZE_ERROR);
-  }
+  std::vector<UInt32> temp_key_ids(keys.size());
+  build_trie(keys, temp_key_ids.empty() ? NULL : &temp_key_ids[0], flags);
+  key_ids->swap(temp_key_ids);
 }
 
 void Trie::build_trie(Vector<Key<String> > &keys,
@@ -168,7 +162,7 @@ void Trie::build_trie(Vector<Key<T> > &keys,
 
 template <typename T>
 void Trie::build_cur(Vector<Key<T> > &keys,
-    Vector<UInt32> *terminals, Progress &progress) try {
+    Vector<UInt32> *terminals, Progress &progress) {
   num_keys_ = sort_keys(keys);
   louds_.push_back(true);
   louds_.push_back(false);
@@ -261,10 +255,6 @@ void Trie::build_cur(Vector<Key<T> > &keys,
 
   build_terminals(keys, terminals);
   keys.swap(&rest_keys);
-} catch (const std::bad_alloc &) {
-  MARISA_THROW(MARISA_MEMORY_ERROR);
-} catch (const std::length_error &) {
-  MARISA_THROW(MARISA_SIZE_ERROR);
 }
 
 void Trie::build_next(Vector<Key<String> > &keys,
diff --git a/lib/marisa/trie-c.cc b/lib/marisa/trie-c.cc
index 00ebe80..9e11405 100644
--- a/lib/marisa/trie-c.cc
+++ b/lib/marisa/trie-c.cc
@@ -79,106 +79,88 @@ marisa_status marisa_end(marisa_trie *h) {
 
 marisa_status marisa_build(marisa_trie *h, const char * const *keys,
     size_t num_keys, const size_t *key_lengths, const double *key_weights,
-    marisa_uint32 *key_ids, int flags) try {
+    marisa_uint32 *key_ids, int flags) {
   if (h == NULL) {
     return MARISA_HANDLE_ERROR;
   }
   h->trie.build(keys, num_keys, key_lengths, key_weights, key_ids, flags);
   h->mapper.clear();
   return MARISA_OK;
-} catch (const marisa::Exception &ex) {
-  return ex.status();
 }
 
 marisa_status marisa_mmap(marisa_trie *h, const char *filename,
-    long offset, int whence) try {
+    long offset, int whence) {
   if (h == NULL) {
     return MARISA_HANDLE_ERROR;
   }
   h->trie.mmap(&h->mapper, filename, offset, whence);
   return MARISA_OK;
-} catch (const marisa::Exception &ex) {
-  return ex.status();
 }
 
-marisa_status marisa_map(marisa_trie *h, const void *ptr, size_t size) try {
+marisa_status marisa_map(marisa_trie *h, const void *ptr, size_t size) {
   if (h == NULL) {
     return MARISA_HANDLE_ERROR;
   }
   h->trie.map(ptr, size);
   h->mapper.clear();
   return MARISA_OK;
-} catch (const marisa::Exception &ex) {
-  return ex.status();
 }
 
 marisa_status marisa_load(marisa_trie *h, const char *filename,
-    long offset, int whence) try {
+    long offset, int whence) {
   if (h == NULL) {
     return MARISA_HANDLE_ERROR;
   }
   h->trie.load(filename, offset, whence);
   h->mapper.clear();
   return MARISA_OK;
-} catch (const marisa::Exception &ex) {
-  return ex.status();
 }
 
-marisa_status marisa_fread(marisa_trie *h, FILE *file) try {
+marisa_status marisa_fread(marisa_trie *h, FILE *file) {
   if (h == NULL) {
     return MARISA_HANDLE_ERROR;
   }
   h->trie.fread(file);
   h->mapper.clear();
   return MARISA_OK;
-} catch (const marisa::Exception &ex) {
-  return ex.status();
 }
 
-marisa_status marisa_read(marisa_trie *h, int fd) try {
+marisa_status marisa_read(marisa_trie *h, int fd) {
   if (h == NULL) {
     return MARISA_HANDLE_ERROR;
   }
   h->trie.read(fd);
   h->mapper.clear();
   return MARISA_OK;
-} catch (const marisa::Exception &ex) {
-  return ex.status();
 }
 
 marisa_status marisa_save(const marisa_trie *h, const char *filename,
-    int trunc_flag, long offset, int whence) try {
+    int trunc_flag, long offset, int whence) {
   if (h == NULL) {
     return MARISA_HANDLE_ERROR;
   }
   h->trie.save(filename, trunc_flag != 0, offset, whence);
   return MARISA_OK;
-} catch (const marisa::Exception &ex) {
-  return ex.status();
 }
 
-marisa_status marisa_fwrite(const marisa_trie *h, FILE *file) try {
+marisa_status marisa_fwrite(const marisa_trie *h, FILE *file) {
   if (h == NULL) {
     return MARISA_HANDLE_ERROR;
   }
   h->trie.fwrite(file);
   return MARISA_OK;
-} catch (const marisa::Exception &ex) {
-  return ex.status();
 }
 
-marisa_status marisa_write(const marisa_trie *h, int fd) try {
+marisa_status marisa_write(const marisa_trie *h, int fd) {
   if (h == NULL) {
     return MARISA_HANDLE_ERROR;
   }
   h->trie.write(fd);
   return MARISA_OK;
-} catch (const marisa::Exception &ex) {
-  return ex.status();
 }
 
 marisa_status marisa_restore(const marisa_trie *h, marisa_uint32 key_id,
-    char *key_buf, size_t key_buf_size, size_t *key_length) try {
+    char *key_buf, size_t key_buf_size, size_t *key_length) {
   if (h == NULL) {
     return MARISA_HANDLE_ERROR;
   } else if (key_length == NULL) {
@@ -186,12 +168,10 @@ marisa_status marisa_restore(const marisa_trie *h, marisa_uint32 key_id,
   }
   *key_length = h->trie.restore(key_id, key_buf, key_buf_size);
   return MARISA_OK;
-} catch (const marisa::Exception &ex) {
-  return ex.status();
 }
 
 marisa_status marisa_lookup(const marisa_trie *h,
-    const char *ptr, size_t length, marisa_uint32 *key_id) try {
+    const char *ptr, size_t length, marisa_uint32 *key_id) {
   if (h == NULL) {
     return MARISA_HANDLE_ERROR;
   } else if (key_id == NULL) {
@@ -203,14 +183,12 @@ marisa_status marisa_lookup(const marisa_trie *h,
     *key_id = h->trie.lookup(ptr, length);
   }
   return MARISA_OK;
-} catch (const marisa::Exception &ex) {
-  return ex.status();
 }
 
 marisa_status marisa_find(const marisa_trie *h,
     const char *ptr, size_t length,
     marisa_uint32 *key_ids, size_t *key_lengths,
-    size_t max_num_results, size_t *num_results) try {
+    size_t max_num_results, size_t *num_results) {
   if (h == NULL) {
     return MARISA_HANDLE_ERROR;
   } else if (num_results == NULL) {
@@ -223,8 +201,6 @@ marisa_status marisa_find(const marisa_trie *h,
         key_ids, key_lengths, max_num_results);
   }
   return MARISA_OK;
-} catch (const marisa::Exception &ex) {
-  return ex.status();
 }
 
 marisa_status marisa_find_first(const marisa_trie *h,
@@ -262,7 +238,7 @@ marisa_status marisa_find_last(const marisa_trie *h,
 marisa_status marisa_find_callback(const marisa_trie *h,
     const char *ptr, size_t length,
     int (*callback)(void *, marisa_uint32, size_t),
-    void *first_arg_to_callback) try {
+    void *first_arg_to_callback) {
   if (h == NULL) {
     return MARISA_HANDLE_ERROR;
   } else if (callback == NULL) {
@@ -276,8 +252,6 @@ marisa_status marisa_find_callback(const marisa_trie *h,
         ::FindCallback(callback, first_arg_to_callback));
   }
   return MARISA_OK;
-} catch (const marisa::Exception &ex) {
-  return ex.status();
 }
 
 marisa_status marisa_predict(const marisa_trie *h,
@@ -289,7 +263,7 @@ marisa_status marisa_predict(const marisa_trie *h,
 
 marisa_status marisa_predict_breadth_first(const marisa_trie *h,
     const char *ptr, size_t length, marisa_uint32 *key_ids,
-    size_t max_num_results, size_t *num_results) try {
+    size_t max_num_results, size_t *num_results) {
   if (h == NULL) {
     return MARISA_HANDLE_ERROR;
   } else if (num_results == NULL) {
@@ -303,13 +277,11 @@ marisa_status marisa_predict_breadth_first(const marisa_trie *h,
         ptr, length, key_ids, NULL, max_num_results);
   }
   return MARISA_OK;
-} catch (const marisa::Exception &ex) {
-  return ex.status();
 }
 
 marisa_status marisa_predict_depth_first(const marisa_trie *h,
     const char *ptr, size_t length, marisa_uint32 *key_ids,
-    size_t max_num_results, size_t *num_results) try {
+    size_t max_num_results, size_t *num_results) {
   if (h == NULL) {
     return MARISA_HANDLE_ERROR;
   } else if (num_results == NULL) {
@@ -323,14 +295,12 @@ marisa_status marisa_predict_depth_first(const marisa_trie *h,
         ptr, length, key_ids, NULL, max_num_results);
   }
   return MARISA_OK;
-} catch (const marisa::Exception &ex) {
-  return ex.status();
 }
 
 marisa_status marisa_predict_callback(const marisa_trie *h,
     const char *ptr, size_t length,
     int (*callback)(void *, marisa_uint32, const char *, size_t),
-    void *first_arg_to_callback) try {
+    void *first_arg_to_callback) {
   if (h == NULL) {
     return MARISA_HANDLE_ERROR;
   } else if (callback == NULL) {
@@ -344,8 +314,6 @@ marisa_status marisa_predict_callback(const marisa_trie *h,
         ::PredictCallback(callback, first_arg_to_callback));
   }
   return MARISA_OK;
-} catch (const marisa::Exception &ex) {
-  return ex.status();
 }
 
 size_t marisa_get_num_tries(const marisa_trie *h) {
diff --git a/lib/marisa/trie-inline.h b/lib/marisa/trie-inline.h
index 6b1e502..2c9218c 100644
--- a/lib/marisa/trie-inline.h
+++ b/lib/marisa/trie-inline.h
@@ -179,7 +179,7 @@ inline bool Trie::find_child(UInt32 &node, T query,
 }
 
 template <typename T, typename U>
-std::size_t Trie::find_callback_(T query, U callback) const try {
+std::size_t Trie::find_callback_(T query, U callback) const {
   std::size_t count = 0;
   UInt32 node = 0;
   std::size_t pos = 0;
@@ -192,10 +192,6 @@ std::size_t Trie::find_callback_(T query, U callback) const try {
     }
   } while (!query.ends_at(pos) && find_child<T>(node, query, pos));
   return count;
-} catch (const std::bad_alloc &) {
-  MARISA_THROW(MARISA_MEMORY_ERROR);
-} catch (const std::length_error &) {
-  MARISA_THROW(MARISA_SIZE_ERROR);
 }
 
 template <typename T>
@@ -235,7 +231,7 @@ inline bool Trie::predict_child(UInt32 &node, T query, std::size_t &pos,
 }
 
 template <typename T, typename U>
-std::size_t Trie::predict_callback_(T query, U callback) const try {
+std::size_t Trie::predict_callback_(T query, U callback) const {
   std::string key;
   UInt32 node = 0;
   std::size_t pos = 0;
@@ -299,10 +295,6 @@ std::size_t Trie::predict_callback_(T query, U callback) const try {
     ++stack_pos;
   }
   return count;
-} catch (const std::bad_alloc &) {
-  MARISA_THROW(MARISA_MEMORY_ERROR);
-} catch (const std::length_error &) {
-  MARISA_THROW(MARISA_SIZE_ERROR);
 }
 
 inline UInt32 Trie::key_id_to_node(UInt32 key_id) const {
diff --git a/lib/marisa/trie-search.cc b/lib/marisa/trie-search.cc
index 1f35681..098e0b3 100644
--- a/lib/marisa/trie-search.cc
+++ b/lib/marisa/trie-search.cc
@@ -247,30 +247,22 @@ std::size_t Trie::predict_depth_first(
 
 void Trie::restore_(UInt32 key_id, std::string *key) const {
   const std::size_t start_pos = key->length();
-  try {
-    UInt32 node = key_id_to_node(key_id);
-    while (node != 0) {
-      if (has_link(node)) {
-        const std::size_t prev_pos = key->length();
-        if (has_trie()) {
-          trie_->trie_restore(get_link(node), key);
-        } else {
-          tail_restore(node, key);
-        }
-        std::reverse(key->begin() + prev_pos, key->end());
+  UInt32 node = key_id_to_node(key_id);
+  while (node != 0) {
+    if (has_link(node)) {
+      const std::size_t prev_pos = key->length();
+      if (has_trie()) {
+        trie_->trie_restore(get_link(node), key);
       } else {
-        *key += labels_[node];
+        tail_restore(node, key);
       }
-      node = get_parent(node);
-    }
-    std::reverse(key->begin() + start_pos, key->end());
-  } catch (const std::bad_alloc &) {
-    key->resize(start_pos);
-    MARISA_THROW(MARISA_MEMORY_ERROR);
-  } catch (const std::length_error &) {
-    key->resize(start_pos);
-    MARISA_THROW(MARISA_SIZE_ERROR);
+      std::reverse(key->begin() + prev_pos, key->end());
+    } else {
+      *key += labels_[node];
+    }
+    node = get_parent(node);
   }
+  std::reverse(key->begin() + start_pos, key->end());
 }
 
 void Trie::trie_restore(UInt32 node, std::string *key) const {
@@ -468,7 +460,7 @@ template std::size_t Trie::tail_match<const Query &>(UInt32 node,
 
 template <typename T, typename U, typename V>
 std::size_t Trie::find_(T query, U key_ids, V key_lengths,
-    std::size_t max_num_results) const try {
+    std::size_t max_num_results) const {
   if (max_num_results == 0) {
     return 0;
   }
@@ -489,10 +481,6 @@ std::size_t Trie::find_(T query, U key_ids, V key_lengths,
     }
   } while (!query.ends_at(pos) && find_child<T>(node, query, pos));
   return count;
-} catch (const std::bad_alloc &) {
-  MARISA_THROW(MARISA_MEMORY_ERROR);
-} catch (const std::length_error &) {
-  MARISA_THROW(MARISA_SIZE_ERROR);
 }
 
 template <typename T>
@@ -533,7 +521,7 @@ UInt32 Trie::find_last_(T query, std::size_t *key_length) const {
 
 template <typename T, typename U, typename V>
 std::size_t Trie::predict_breadth_first_(T query, U key_ids, V keys,
-    std::size_t max_num_results) const try {
+    std::size_t max_num_results) const {
   if (max_num_results == 0) {
     return 0;
   }
@@ -596,15 +584,11 @@ std::size_t Trie::predict_breadth_first_(T query, U key_ids, V keys,
     node_end = louds_pos_to_node(get_child(node_end), node_end);
   }
   return count;
-} catch (const std::bad_alloc &) {
-  MARISA_THROW(MARISA_MEMORY_ERROR);
-} catch (const std::length_error &) {
-  MARISA_THROW(MARISA_SIZE_ERROR);
 }
 
 template <typename T, typename U, typename V>
 std::size_t Trie::predict_depth_first_(T query, U key_ids, V keys,
-    std::size_t max_num_results) const try {
+    std::size_t max_num_results) const {
   if (max_num_results == 0) {
     return 0;
   } else if (keys.is_valid()) {
@@ -665,10 +649,6 @@ std::size_t Trie::predict_depth_first_(T query, U key_ids, V keys,
     ++stack_pos;
   }
   return count;
-} catch (const std::bad_alloc &) {
-  MARISA_THROW(MARISA_MEMORY_ERROR);
-} catch (const std::length_error &) {
-  MARISA_THROW(MARISA_SIZE_ERROR);
 }
 
 template <typename T>
diff --git a/lib/marisa/writer.cc b/lib/marisa/writer.cc
index 2256f59..55dcb97 100644
--- a/lib/marisa/writer.cc
+++ b/lib/marisa/writer.cc
@@ -92,11 +92,7 @@ void Writer::write_data(const void *data, std::size_t size) {
       MARISA_THROW(MARISA_IO_ERROR);
     }
   } else if (stream_ != NULL) {
-    try {
-      if (!stream_->write(static_cast<const char *>(data), size)) {
-        MARISA_THROW(MARISA_IO_ERROR);
-      }
-    } catch (const std::ios_base::failure &) {
+    if (!stream_->write(static_cast<const char *>(data), size)) {
       MARISA_THROW(MARISA_IO_ERROR);
     }
   } else {