【发布时间】:2012-11-16 04:00:28
【问题描述】:
简介(来自 Eric Lippert 博客) :
令人烦恼的异常是不幸的设计决策的结果。 令人烦恼的异常以完全非异常的方式抛出 情况,因此必须始终抓住并处理。
令人烦恼的异常的经典示例是 Int32.Parse,它抛出 如果你给它一个不能被解析为整数的字符串。但是 此方法 99% 的用例是转换由 用户,这可能是任何旧事物,因此绝不是 解析失败的例外情况。更糟糕的是,没有办法 来电者提前确定他们的论点是否错误 没有自己实现整个方法,在这种情况下,他们 一开始就不需要调用它。
现在是重要的部分:
这个不幸的设计决定非常令人烦恼,当然 此后不久,框架团队实施了 TryParse 正确的事情。
来自 MSDN Int32.TryParse:
返回值类型:System.Boolean 如果 s 被转换则为真 成功地;否则为假。
所以同事最近正在编写一些需要检查字符串是否为数字的代码,因此在考虑并意识到没有好的 C++ 解决方案之后(基本上它是 for__each/find_if 或 boost:lexical_cast try catch ) 我想拥有is_convertible 或来自 boost 的东西会有多好?
Ofc 我可以包装 boost lexical_cast 并在 try 块结束时返回 true 并在 catch 块结束时返回 false,但我更喜欢现有的做法 :) 解决方案。
【问题讨论】:
-
顺便说一句,请注意,尽管 Eric 的文章非常引人注目,但它在逻辑上并不连贯:他描述为必要的邪恶(“外生”)的例外实际上并不是必需的 - 只需考虑 IO:C++ IO 流在不使用异常的情况下很好地对这些条件进行建模,Eric 将其描述为必要的。
-
对不起,我从不关心 iostreams(并且不理解他们得到的仇恨 :D)你说他们有 good(), bad(),... 功能吗?
-
基本上,是的。默认情况下,它们不是通过异常而是通过标志来指示失败状态,即使是在 .NET 中会引发“外生”异常的状态。
-
idk 老实说,我更喜欢用一种统一的方式在 c++ 中做事,但是我没有足够的返回码/标志/异常的 exp,所以我的意见并不重要。 :)