diff --git a/src/rpc/server.cpp b/src/rpc/server.cpp index 8631ae0adfe..8d120f41ef4 100644 --- a/src/rpc/server.cpp +++ b/src/rpc/server.cpp @@ -97,11 +97,8 @@ std::string CRPCTable::help(const std::string& strCommand, const JSONRPCRequest& UniValue unused_result; if (setDone.insert(pcmd->unique_id).second) pcmd->actor(jreq, unused_result, /*last_handler=*/true); - } - catch (const std::exception& e) - { - // Help text is returned in an exception - std::string strHelp = std::string(e.what()); + } catch (const HelpResult& e) { + std::string strHelp{e.what()}; if (strCommand == "") { if (strHelp.find('\n') != std::string::npos) diff --git a/src/rpc/util.cpp b/src/rpc/util.cpp index 5ddc02c94ee..5da02b4df4e 100644 --- a/src/rpc/util.cpp +++ b/src/rpc/util.cpp @@ -645,7 +645,7 @@ UniValue RPCHelpMan::HandleRequest(const JSONRPCRequest& request) const * the user is asking for help information, and throw help when appropriate. */ if (request.mode == JSONRPCRequest::GET_HELP || !IsValidNumArgs(request.params.size())) { - throw std::runtime_error(ToString()); + throw HelpResult{ToString()}; } UniValue arg_mismatch{UniValue::VOBJ}; for (size_t i{0}; i < m_args.size(); ++i) { diff --git a/src/rpc/util.h b/src/rpc/util.h index b2387a4c8ef..1650d2da1f6 100644 --- a/src/rpc/util.h +++ b/src/rpc/util.h @@ -67,6 +67,10 @@ class FillableSigningProvider; class CScript; struct Sections; +struct HelpResult : std::runtime_error { + explicit HelpResult(const std::string& msg) : std::runtime_error{msg} {} +}; + /** * Gets all existing output types formatted for RPC help sections. *