在 gRPC 服务器端显示运行时错误消息并将其传递给客户端

Display runtime error message in gRPC server side and pass it to the client

我在一个项目中使用 gRPC,我必须从一些 separate/outside 函数中设置和获取值。有些函数有这样的情况,如果它们获得不需要的值,它们将 throw runtime error。通过关注 this,我有了一个从 gRPC 函数内部捕获 error_state 的想法。

我在这里给出一些我的方法。演示源是 this

proto file where only including here the client message part

message NameQuery {
    string name = 1;
    int32 cl_value = 2; // This is a user input data which will be passed to the server and then to a outside function

client/src/main.cpp

int main(int argc, char* argv[])
{
    // Setup request
    expcmake::NameQuery query;
    expcmake::Address result;
    query.set_name("John");

    int x;
    cout << "give value of x: ";
    cin>> x;
    query.set_cl_value(x);

   // remaining are as like as before

server/src/main.cpp

#include <iostream>
using namespace std;

void Check_Value(const ::expcmake::NameQuery* request)
{
    if (request->cl_value() < 5)
        cout << "request->cl_value(): " << request->cl_value() << endl;
    else
        throw std::runtime_error("********** BAD VALUE **********");
}

class AddressBookService final : public expcmake::AddressBook::Service {
    public:
        virtual ::grpc::Status GetAddress(::grpc::ServerContext* context, const ::expcmake::NameQuery* request, ::expcmake::Address* response)
        {
            std::cout << "Server: GetAddress for \"" << request->name() << "\"." << std::endl;
            Check_Value(request);

        // remaining are as like as before

在构建项目后,如果从客户端给出 5 或大于 5 server 没有显示任何消息,但 运行 连续显示(这很明显对于 gRPC 的 Wait 函数)我的期望是它应该在服务器控制台中打印

********** BAD VALUE **********

不过,在客户端,我得到的所有传递值都是 BLANK,我可以假设,serverruntime_error 之后没有执行任何过程。

所以我的查询是: 1/ 如何在服务器端控制台中看到 runtime_error 消息? 2/ Any gRPC default system 将此事件传递给客户端(任何通用消息)。

Note: 在我的真实示例中,这个 runtime_error 消息相关函数来自另一个我无法访问修改的项目。

找到解决方案。

server 方面我错过了 try ... catch 的正确使用方式。

server.cpp

try
{
    Check_Value(request);
}
catch(const std::exception& e)
{
    std::cout << e.what() << std::endl; // This will display the error message in server console
    return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT, e.what());
}

关于 error handler in client side is found here 的很棒的资源。

client.cpp

// Class instance, message instances declaration

grpc::Status status = stub->GetAddress(&context, request_, &response);
if (status.ok())
    // print server response, do the required job
else
    std::cout << status.error_message() << std::endl;