diff --git a/src/input/plugins/SmbclientInputPlugin.cxx b/src/input/plugins/SmbclientInputPlugin.cxx
index 66c40957e..97be5c47a 100644
--- a/src/input/plugins/SmbclientInputPlugin.cxx
+++ b/src/input/plugins/SmbclientInputPlugin.cxx
@@ -28,6 +28,8 @@
 
 #include <libsmbclient.h>
 
+#include <stdexcept>
+
 class SmbclientInputStream final : public InputStream {
 	SMBCCTX *ctx;
 	int fd;
@@ -66,10 +68,13 @@ public:
  */
 
 static InputPlugin::InitResult
-input_smbclient_init(gcc_unused const ConfigBlock &block, Error &error)
+input_smbclient_init(gcc_unused const ConfigBlock &block, gcc_unused Error &error)
 {
-	if (!SmbclientInit(error))
+	try {
+		SmbclientInit();
+	} catch (const std::runtime_error &e) {
 		return InputPlugin::InitResult::UNAVAILABLE;
+	}
 
 	// TODO: create one global SMBCCTX here?
 
diff --git a/src/lib/smbclient/Init.cxx b/src/lib/smbclient/Init.cxx
index 11f9174f1..b8b7d8391 100644
--- a/src/lib/smbclient/Init.cxx
+++ b/src/lib/smbclient/Init.cxx
@@ -21,7 +21,7 @@
 #include "Init.hxx"
 #include "Mutex.hxx"
 #include "thread/Mutex.hxx"
-#include "util/Error.hxx"
+#include "system/Error.hxx"
 
 #include <libsmbclient.h>
 
@@ -40,16 +40,12 @@ mpd_smbc_get_auth_data(gcc_unused const char *srv,
 	strcpy(pw, "");
 }
 
-bool
-SmbclientInit(Error &error)
+void
+SmbclientInit()
 {
 	const ScopeLock protect(smbclient_mutex);
 
 	constexpr int debug = 0;
-	if (smbc_init(mpd_smbc_get_auth_data, debug) < 0) {
-		error.SetErrno("smbc_init() failed");
-		return false;
-	}
-
-	return true;
+	if (smbc_init(mpd_smbc_get_auth_data, debug) < 0)
+		throw MakeErrno("smbc_init() failed");
 }
diff --git a/src/lib/smbclient/Init.hxx b/src/lib/smbclient/Init.hxx
index 000e83365..ec3d9be4e 100644
--- a/src/lib/smbclient/Init.hxx
+++ b/src/lib/smbclient/Init.hxx
@@ -20,14 +20,12 @@
 #ifndef MPD_SMBCLIENT_INIT_HXX
 #define MPD_SMBCLIENT_INIT_HXX
 
-#include "check.h"
-
-class Error;
-
 /**
  * Initialize libsmbclient.
+ *
+ * Throws std::runtime_error on error.
  */
-bool
-SmbclientInit(Error &error);
+void
+SmbclientInit();
 
 #endif
diff --git a/src/neighbor/plugins/SmbclientNeighborPlugin.cxx b/src/neighbor/plugins/SmbclientNeighborPlugin.cxx
index ea0528d35..32125896a 100644
--- a/src/neighbor/plugins/SmbclientNeighborPlugin.cxx
+++ b/src/neighbor/plugins/SmbclientNeighborPlugin.cxx
@@ -273,8 +273,7 @@ smbclient_neighbor_create(gcc_unused EventLoop &loop,
 			  gcc_unused const ConfigBlock &block,
 			  gcc_unused Error &error)
 {
-	if (!SmbclientInit(error))
-		return nullptr;
+	SmbclientInit();
 
 	return new SmbclientNeighborExplorer(listener);
 }
diff --git a/src/storage/plugins/SmbclientStorage.cxx b/src/storage/plugins/SmbclientStorage.cxx
index a7d00e8cf..86b727315 100644
--- a/src/storage/plugins/SmbclientStorage.cxx
+++ b/src/storage/plugins/SmbclientStorage.cxx
@@ -189,8 +189,7 @@ CreateSmbclientStorageURI(gcc_unused EventLoop &event_loop, const char *base,
 	if (memcmp(base, "smb://", 6) != 0)
 		return nullptr;
 
-	if (!SmbclientInit(error))
-		return nullptr;
+	SmbclientInit();
 
 	const ScopeLock protect(smbclient_mutex);
 	SMBCCTX *ctx = smbc_new_context();