将错误处理添加到加载数据的函数(但有时还需要使用默认值)
Adding error handling to a function that loads data (but also needs to use default values sometimes)
我正在尝试找到一种非笨拙的方式,将错误处理介绍到从数据源加载数据的函数中。障碍是数据源可能(或可能不)包含无效的数据,并且如果值无法解析值,则根据数据源的"修订",应使用默认值或应生成错误:
class Foo {
int value_1;
int value_2;
//...
void loadDataFromSource(DataSource source)
{
int revision = source.getRevision();
value_1 = source.parseValue(1);
value_2 = source.parseValue(2);
//...
}
}
函数" parsevalue()"当前返回默认值如果无法解析,但是如上所述,需要介绍错误处理。我可以让" parsevalue()"投掷异常并处理它们(取决于数据源修订),例如
void loadDataFromSource_NewRevision(DataSource source)
{
//Exceptions thrown by parseValue() are handled by the caller of this function
value_1 = source.parseValue(1);
value_2 = source.parseValue(2);
//...
}
void loadDataFromSource_OldRevision(DataSource source)
{
//Exceptions thrown by parseValue() are discarded and default values are used
try { value_1 = source.parseValue(1); }
catch(...) { value_1 = 42; }
try { value_2 = source.parseValue(2); }
catch(...) { value_2 = -7; }
//...
}
但是代码重复和整个设置感觉很糟糕。使用某种标志告诉parsevalue()投掷/不示例。
也是如此。void loadDataFromSource(DataSource source)
{
int revision = source.getRevision();
bool useDefaultValueOnError = revision < 10;
//Exceptions thrown by parseValue() - if any - are handled by the caller of this function
value_1 = source.parseValue(1, useDefaultValueOnError, 42);
value_2 = source.parseValue(2, useDefaultValueOnError, -7);
//...
}
我想避免代码重复,但是"标志"选项看起来同样没有吸引力。有人知道这样做的更好方法吗?
编辑/小更新:我设法减少了值的数量,我们需要使用一个默认值(如果它在数据源的旧修订中未解析)为少数。对于那些我创建了第二个使用参数的" ParseValueWithDefault"功能,并且使用"使用默认的eRror"标志,该标志调用原始解析功能,捕获错误并返回默认值或重新返回异常。不是完美的,但我觉得这是目前最不糟糕的选择。
int parseValueWithDefault(int valueId, int defaultValue, bool useDefaultOnError)
{
try
{
return source.parseValue(valueId);
}
catch (Exception& e)
{
if (useDefaultOnError)
return defaultValue;
throw;
}
}
建议:
假设提供的代码片段包含与可用的相同信息,则有几种方法可以从旧修订中构建,但这取决于每种情况下可能会抛出的例外,或者如果您这样做任何例外。这个答案仅仅是关于错误处理件而不是处理值。
void loadDataFromSource_OldRevision(DataSource source)
{
//Exceptions thrown by parseValue() are discarded and default values are used
try { value_1 = source.parseValue(1); }
catch(...) { value_1 = 42; }
try { value_2 = source.parseValue(2); }
catch(...) { value_2 = -7; }
//...
}
假设您知道例外,则有几个选择。如果您有不同的例外,则可以在两个捕获语句中直接指定它们(如下所示;简化命名仅用于解释,您可以搜索特定的异常)。
try{
// parse value
} catch (SomeOldException ex) {
// give default
} catch (SomeNewException ex) {
// throw exception
}
对于使用多个值,您可以按照您决定的方式进行收集和迭代。
如果两个修订都引发了相同的错误,或者您需要例外以始终是" catch all"异常(...),那么您可以使用数据源中似乎可用的修订(如下所示))。
try{
// parse value
} catch (...) {
// check the revision number
//throw exception or provide default value respectively
希望这会有所帮助。和其他人,请随时在您认为合适的地方进行编辑。这已经有一段时间了,因为我定期使用C 。
还有其他一些选项,但是在我真正谈论它们作为答案之前,我还需要在C 中进行一些复习。随着您获得更多的修订/默认价值更正,研究其他一些在其他语言中也有益的概念可能是有益的。例如,抽象类,依赖注入或任何有助于分离对象中关注点的东西。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 具有默认值的引用获取函数
- 当给定默认值时,为什么此模板参数推导失败
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 格式化浮点值:返回默认值
- 如何将数组部分初始化为某个默认值?
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- 创建一个包含 c++ 默认值的环境文件
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- Makefile g++ 使用命令行中的 -D 变量进行编译,默认值
- Switch 语句(字符串)一直选择默认值,除非其为零
- 使用指针将 ASCII 值添加到整数
- 如何使用默认值将枚举声明为 extern
- 在C++中将(预定义的)原子值添加到矢量
- 如何在提升程序选项中设置矢量<矢量>的默认值<string>
- 如何使用默认值为构造函数中的枚举赋值?
- 变量始终在函数中重置为默认值
- 将错误处理添加到加载数据的函数(但有时还需要使用默认值)
- C ++多个CIN默认值(如果未输入),则添加到map<string,vector<double>>
- 代码没有添加最后的默认值