diff --git a/cmdline/CtaAdminCmd.cpp b/cmdline/CtaAdminCmd.cpp
index edbd961c0fb459da051615e9f3c41a91f76fff67..017c11d0e69f0ab491384d9e05e8f6708bd354b5 100644
--- a/cmdline/CtaAdminCmd.cpp
+++ b/cmdline/CtaAdminCmd.cpp
@@ -38,6 +38,16 @@ cta::admin::TextFormatter formattedText(1000);
 
 namespace XrdSsiPb {
 
+/*!
+ * User error exception
+ */
+class UserException : public std::runtime_error
+{
+public:
+  UserException(const std::string &err_msg) : std::runtime_error(err_msg) {}
+};
+
+
 /*!
  * Alert callback.
  *
@@ -283,7 +293,7 @@ void CtaAdminCmd::send() const
          isHeaderSent = true;
          break;
       case Response::RSP_ERR_PROTOBUF:                     throw XrdSsiPb::PbException(response.message_txt());
-      case Response::RSP_ERR_USER:
+      case Response::RSP_ERR_USER:                         throw XrdSsiPb::UserException(response.message_txt());
       case Response::RSP_ERR_CTA:                          throw std::runtime_error(response.message_txt());
       default:                                             throw XrdSsiPb::PbException("Invalid response type.");
    }
@@ -490,6 +500,10 @@ int main(int argc, const char **argv)
       std::cerr << "Error in Google Protocol Buffers: " << ex.what() << std::endl;
    } catch (XrdSsiPb::XrdSsiException &ex) {
       std::cerr << "Error from XRootD SSI Framework: " << ex.what() << std::endl;
+   } catch (XrdSsiPb::UserException &ex) {
+      if(CtaAdminCmd::isJson()) std::cout << CtaAdminCmd::jsonCloseDelim();
+      std::cerr << ex.what() << std::endl;
+      return 2;
    } catch (std::runtime_error &ex) {
       std::cerr << ex.what() << std::endl;
    } catch (std::exception &ex) {