在 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
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
#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
,我可以假设,server
在 runtime_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;
我在一个项目中使用 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
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
#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
,我可以假设,server
在 runtime_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;