.
diff --git a/src/_decoder.pyx b/src/_decoder.pyx
index e08c6b4..6857ded 100644
--- a/src/_decoder.pyx
+++ b/src/_decoder.pyx
@@ -511,7 +511,7 @@
             try:
                 value = _decode_recursive(reader, &c0)
             except _DecoderException as ex:
-                result[key] = ex.result
+                result[key] = (<_DecoderException> ex).result
                 raise
 
             if expect(c0 < 0, False):
@@ -550,7 +550,7 @@
             try:
                 value = _decode_recursive(reader, &c0)
             except _DecoderException as ex:
-                result.append(ex.result)
+                result.append((<_DecoderException> ex).result)
                 raise
 
             if expect(c0 < 0, False):
@@ -637,7 +637,7 @@
     except RecursionError:
         _raise_nesting(_reader_tell(reader), result)
     except _DecoderException as ex:
-        ex.result = result
+        (<_DecoderException> ex).result = result
         raise ex
     finally:
         _reader_leave(reader)
@@ -706,19 +706,21 @@
             c1 = cast_to_uint32(c0)
             _raise_unframed_data(c1, start)
     except _DecoderException as ex:
-        ex.result = result
+        (<_DecoderException> ex).result = result
         raise ex
 
     return result
 
 
 cdef object _decode_all(ReaderRef reader, boolean some):
-    cdef Exception ex
+    cdef Exception ex_result
+    cdef _DecoderException ex
     try:
         return _decode_all_sub(reader, some)
     except _DecoderException as e:
-        ex = e.cls(e.msg, e.result, e.extra)
-    raise ex
+        ex = <_DecoderException> e
+        ex_result = ex.cls(ex.msg, ex.result, ex.extra)
+    raise ex_result
 
 
 cdef object _decode_ucs1(const void *string, Py_ssize_t length,
diff --git a/src/_exceptions_decoder.pyx b/src/_exceptions_decoder.pyx
index aa64528..3f57afb 100644
--- a/src/_exceptions_decoder.pyx
+++ b/src/_exceptions_decoder.pyx
@@ -62,8 +62,15 @@
         return self.args[2]
 
 
-class _DecoderException(BaseException):
-    def __init__(self, cls, msg, extra, result):
+@final
+@auto_pickle(False)
+cdef class _DecoderException(Exception):
+    cdef object cls
+    cdef object msg
+    cdef object extra
+    cdef object result
+
+    def __cinit__(self, cls, msg, extra, result):
         self.cls = cls
         self.msg = msg
         self.extra = extra