【发布时间】:2011-01-20 13:22:01
【问题描述】:
我们有一个 C++/MFC 应用程序,它允许用户通过配置文件自定义日期格式。不想重新发明轮子,我将格式字符串传递给 CTime::Format("") 以进行实际格式化。在幕后,Format 调用标准 C 函数 strftime() 的变体。
当然,用户可能会意外输入无效的格式字符串。 (例如,“%s”而不是“%S”。)发生这种情况时,C 运行时调用Invalid Argument Handler,默认情况下,它会退出应用程序。 (没有异常可捕获——只是应用退出。)
我的问题是如何优雅地处理这种不受信任的输入。理论上,我可以为格式字符串编写自己的解析器/验证器,但这听起来像是在浪费时间。相反,我能想到的最好办法是设置我自己的(全局)无效参数处理程序,它不会退出,而是抛出一个无效参数异常:
void MyInvalidParameterHandler(
const wchar_t* expression,
const wchar_t* function,
const wchar_t* file,
unsigned int line,
uintptr_t pReserved)
{
::AfxThrowInvalidArgException();
}
这似乎确实有效,并且允许我在我“期望”它们发生的情况下显式捕获(并优雅地处理)无效参数异常。然而,我担心我正在覆盖大型应用程序中的全局运行时设置,以解决相对“本地”的问题——我不希望这个修复在其他地方引起额外的问题。
这种方法合理吗?或者有没有更简洁的方法来解决这个问题?
【问题讨论】:
标签: mfc validation strftime