gpt4 book ai didi

c++ - 了解执行流程的异常处理

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:01:35 31 4
gpt4 key购买 nike

编辑:

对于对更简洁的实现方式感兴趣的人,请查看 answer .


在我的工作中,我经常需要使用第三方API来访问远程系统。例如创建一个请求并将其发送到远程系统:

   #include "external_lib.h"
void SendRequest(UserRequest user_request)
{
try
{
external_lib::Request my_request;
my_request.SetPrice(user_request.price);
my_request.SetVolume(user_request.quantity);
my_request.SetVisibleVolume(user_request.quantity);
my_request.SetReference(user_request.instrument);
my_request.SetUserID(user_request.user_name);
my_request.SetUserPassword(user_request.user_name);
// Meny other member affectations ...
}
catch(external_lib::out_of_range_error& e)
{
// Price , volume ????
}
catch(external_lib::error_t& e)
{
// Here I need to tell the user what was going wrong
}
}

每个 lib 的 setter 都会检查最终用户提供的值,并可能在用户不符合远程系统需求时抛出异常。例如,可能不允许特定用户发送过大的数量。这是一个例子,实际上很多次用户尝试不遵守:不再有效的工具,价格超出限制,等等。因此,我们的最终用户需要一条明确的错误消息来告诉他要在其请求中修改什么以获得第二次机会来撰写有效请求。我必须向他提供这样的提示

无论如何,外部库的异常(大部分)从不指定哪个字段是源中止请求。

在您看来,处理这些异常的最佳方式是什么?

我第一次尝试处理这些异常是用我的方法“包装”Request 类。然后将每个 setter 包装在一个只做一件事的方法中:一个 try/catch block 。然后 catch block 抛出我的新异常:my_out_of_range_volume 或 my_out_of_range_price,具体取决于 setter 。例如 SetVolume() 将以这种方式包装:

My_Request::SetVolume(const int volume) 
{
try
{
m_Request.SetVolume(volume);
}
catch(external_lib::out_range_error& e)
{
throw my_out_of_range_volume(volume, e);
}
}

你怎么看?您如何看待它暗示的异常处理开销? ...:/

好吧,问题是开放的,我需要新的想法来摆脱那个 lib 限制!

最佳答案

如果确实有很多方法需要调用,您可以使用 reflection library 来减少代码量。 ,通过仅创建一个方法来执行调用和异常处理,并将方法/属性的名称作为参数传递给调用/设置。您仍然会有相同数量的 try/catch 调用,但代码会更简单,并且您已经知道失败的方法的名称。

或者,根据它们返回的异常对象的类型,它可能包含堆栈信息,或者您可以使用另一个库来遍历堆栈跟踪以获取它失败的最后一个方法的名称。这取决于您使用的平台。

关于c++ - 了解执行流程的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/717004/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com