diff --git a/src/lib.rs b/src/lib.rs
index 10bf81d59ad9382283742cfe1d4f9b0aa6463b6f..d689aea47d2bc93ad4c56b5036d40789dbe1407b 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -23,6 +23,12 @@ macro_rules! warn_debug {
     };
 }
 
+macro_rules! warn_err {
+    ($msg:literal, $($arg:expr),*) => {
+        rustmex::warning("serialbridge:error", format!($msg, $($arg),*));
+    };
+}
+
 /// in release mode, this macro does nothing
 #[cfg(not(debug_assertions))]
 macro_rules! warn_debug {
@@ -65,23 +71,31 @@ impl Output<'_> {
 /// The entrypoint of the MEX function
 #[rustmex::entrypoint]
 fn serialbridge(lhs: Lhs, rhs: Rhs) -> rustmex::Result<()> {
-    // Create wrappers for the input and output arguments
-    let args = Args(rhs);
-    let out = Output(lhs);
-
-    // Get the mode argument ("Open", "Close", "Read", "Write")
-    let mode = get_mode(args.get(0, Error::MissingSerialMode)?)?;
-
-    warn_debug!("Mode: {:?}", mode);
-
-    // Dispatch to the appropriate function
-    match mode {
-        Mode::Open => open_serial(args)?,
-        Mode::Close => close_serial(args)?,
-        Mode::CloseAll => close_all_serials(args)?,
-        Mode::Read => read_from_serial(out, args)?,
-        Mode::Write => write_to_serial(args)?,
-        Mode::ClearBuffer => clear_buffer(args)?,
+    fn inner(lhs: Lhs, rhs: Rhs) -> rustmex::Result<()> {
+        // Create wrappers for the input and output arguments
+        let args = Args(rhs);
+        let out = Output(lhs);
+
+        // Get the mode argument ("Open", "Close", "Read", "Write")
+        let mode = get_mode(args.get(0, Error::MissingSerialMode)?)?;
+
+        warn_debug!("Mode: {:?}", mode);
+
+        // Dispatch to the appropriate function
+        match mode {
+            Mode::Open => open_serial(args)?,
+            Mode::Close => close_serial(args)?,
+            Mode::CloseAll => close_all_serials(args)?,
+            Mode::Read => read_from_serial(out, args)?,
+            Mode::Write => write_to_serial(args)?,
+            Mode::ClearBuffer => clear_buffer(args)?,
+        }
+
+        Ok(())
+    }
+
+    if let Err(e) = inner(lhs, rhs) {
+        warn_err!("Error: {}", e.to_string());
     }
 
     Ok(())