【发布时间】:2009-04-04 12:39:46
【问题描述】:
编辑:
对于有兴趣以更清洁的方式实现它的人,请查看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
}
}
每个库的设置器都会检查最终用户提供的值,并且当用户不符合远程系统需求时可能会抛出异常。例如,可能不允许特定用户发送太大的音量。这是一个例子,实际上很多次用户尝试不遵守:没有长期有效的工具,价格超出限制等,等等。 因此,我们的最终用户需要明确的错误消息来告诉他在其请求中修改什么以获得第二次机会来编写一个有效的请求。我必须向他提供这样的提示
无论如何,外部库的异常(大部分)从不指定哪个字段是源 中止请求。
您认为处理这些异常的最佳方法是什么?
我第一次尝试处理这些异常是用我的“包装”Request 类。然后将每个 setter 包装在一个只做一件事的方法中:一个 try/catch 块。然后 catch 块会抛出我的一个新异常:my_out_of_range_volume 或 my_out_of_range_price,具体取决于设置器。例如 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 限制!
【问题讨论】: