Avoid Option in ffi

Option seems to work fine on rustc 1.43+ but not 1.42.
diff --git a/macro/src/expand.rs b/macro/src/expand.rs
index defa565..9c198be 100644
--- a/macro/src/expand.rs
+++ b/macro/src/expand.rs
@@ -299,7 +299,7 @@
     }
     expr = quote!(::cxx::private::catch_unwind(__fn, move || #expr));
     let ret = if efn.throws {
-        quote!(-> ::std::option::Option<::cxx::private::RustStr>)
+        quote!(-> ::cxx::private::Error)
     } else {
         expand_extern_return_type(&efn.ret, types)
     };
diff --git a/src/exception.rs b/src/exception.rs
index 3f32b45..57ff552 100644
--- a/src/exception.rs
+++ b/src/exception.rs
@@ -1,23 +1,29 @@
-use crate::rust_str::RustStr;
 use std::fmt::Display;
 use std::ptr;
-use std::slice;
-use std::str;
 
-pub unsafe fn r#try<T, E>(ret: *mut T, result: Result<T, E>) -> Option<RustStr>
+#[repr(C)]
+pub struct Error {
+    ptr: *const u8,
+    len: usize,
+}
+
+pub unsafe fn r#try<T, E>(ret: *mut T, result: Result<T, E>) -> Error
 where
     E: Display,
 {
     match result {
         Ok(ok) => {
             ptr::write(ret, ok);
-            None
+            Error {
+                ptr: ptr::null(),
+                len: 0,
+            }
         }
-        Err(err) => Some(to_c_string(err.to_string())),
+        Err(err) => to_c_string(err.to_string()),
     }
 }
 
-unsafe fn to_c_string(msg: String) -> RustStr {
+unsafe fn to_c_string(msg: String) -> Error {
     let mut msg = msg;
     msg.as_mut_vec().push(b'\0');
     let ptr = msg.as_ptr();
@@ -29,7 +35,5 @@
     }
 
     let copy = error(ptr, len);
-    let slice = slice::from_raw_parts(copy, len);
-    let string = str::from_utf8_unchecked(slice);
-    RustStr::from(string)
+    Error { ptr: copy, len }
 }
diff --git a/src/lib.rs b/src/lib.rs
index 109090c..aa7e84f 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -371,7 +371,7 @@
 // Not public API.
 #[doc(hidden)]
 pub mod private {
-    pub use crate::exception::r#try;
+    pub use crate::exception::{r#try, Error};
     pub use crate::opaque::Opaque;
     pub use crate::rust_str::RustStr;
     pub use crate::rust_string::RustString;