我有一个类可以对给定对象执行多种类型的转换。
所有数据都是由用户提供的(通过手工制作的命令文件),但在大多数情况下,在我们开始转换之前无法确定文件命令是否有效(如果我们先检查了所有内容,我们最终会做与转换本身相同的工作量)
这些转换方法在对象上调用,它返回一个新转换的对象但是如果有问题我们抛出一个异常,因为返回一个对象(甚至是一个空白对象)可能会与成功混淆,而异常会发出一个明确的信号出现问题,无法返回对象。这也意味着我们不需要调用“获取最后错误”类型函数来找出出错的地方(错误代码,消息,语句等)
然而,通过阅读SO上的大量答案,似乎这是不正确的,因为无效的用户输入不是特殊情况,并且由于这种事情的复杂性,用户提交不正确的命令文件并不罕见。
性能在这里不是一个问题,因为如果我们遇到错误,我们必须停下来并返回给用户。
如果我使用返回代码,我必须将输出对象作为参数,然后检查返回代码,如果是块(即从COM检查HRESULT的方式),我需要长嵌套
在保持代码合理整洁的同时,我如何在这种情况下避免异常?
答案 0 :(得分:3)
您的问题的设计确实有助于例外。一旦用户提供错误的输入文件,程序执行将停止或无效的事实是“异常情况”的标志。当然,许多程序运行将以抛出(并被捕获)的异常结束,但这是在程序的一次执行中。
您正在阅读的有关异常在用于其他所有情况时变慢的事情,只有在程序可以恢复并且必须经常恢复时才有效(例如,编译器无法在搜索目录中找到标头,并且查看搜索目录列表中的下一个目录,这确实发生了很多事情。
使用例外。如有疑问,请测量这是否会导致性能下降。清洁代码>>跟随人们对SO的看法。但话说回来,这就是忽略我刚才所说的理由。
答案 1 :(得分:1)
好吧,我不会(避免例外)。如果你真的需要一个“错误报告”机制(而且你确实需要),那么除了返回值和异常之外没有多少。我认为关于什么是特殊的(以及因此应该例外)和不是什么的整个论点对于阻止你解决问题并不重要。特别是如果性能不是问题。但是,如果你真的想要避免异常,你可以使用某种全局队列来排队你的错误iformation。但如果你问我,那就太难看了。