2010-12-13 66 views
1

在另一个线程的评论中告诉我,只要发生任何不寻常的事情,我都应该使用异常,即使它不是致命的脚本。这想出了为我所用结构类似于如下:C++非致命异常处理

return err("File could not be loaded"); 

这将打印错误到屏幕上,并返回false,终止指令处理。有人建议,除非有例外情况,否则这样做会更好。

问题在于,对于所有意图和目的,程序都是通过控制台控制的语言解释程序,这意味着只要命令输入错误或者解释代码中存在错误,就会出现错误需要显示。

除了这些问题似乎很少被作为例外处理的事实之外,应该如何实施呢?如何使用try块来控制处理路径?例如,目前我的代码如下:

if(!validate(code)) 
    return false; //the validate function already having output the error 
else 
    process(code); 

我应该如何保证过程(代码)只执行,如果验证(代码)获得成功吗?我应该只是从catch块中的函数return false;?这似乎回到了使用返回值处理异常事件的原始问题。这在我看来,最根本的问题是,这些问题是不是在所有的异常,但我听从那些有更多的经验比我

+0

毫无疑问,你会得到很多回答:“例外只适用于特殊情况。”请忽略它们。 – 2010-12-13 21:21:20

+0

@John Dibling:例外或评论? – 2010-12-13 21:27:00

+0

是的,如果你不理睬,你也可以忽略,“使用明确有意义的名称”,“RAII是你的朋友”,“不要添加不必要的耦合”,以及任何其他各种人们说你应该遵循的事情来编写清晰且易于维护的代码。 – 2010-12-13 21:30:01

回答

2
try 
{ 
    validate(code); 
    process(code); 
} 
catch(...) 
{ 
    return false; 
} 
return true; 

假设validate抛出,process不会发生。

1

的问题是,你有你的功能设置为使用返回代码。当你的代码已经设置了返回值时,你不能只拖放异常。

做正确的做法是像

std::string code; 
// input into code 
try { 
    validate(code); 
    process(code); // Throws an exception. 
} 
catch(std::runtime_error& except) { 
    std::cout << except.what(); 
    // recover from here. 
} 
+0

1)这只是在一小组假设情况下的正确方法。 2)使用cerr进行错误报告! – 2010-12-13 21:32:14

3

例外的想法是,你不会需要像一个单独的“验证”步骤。每当“进程”到达某个地方发生故障的地方时,抛出一个异常。

如果您确实需要某种原因一个单独的验证步骤,然后它会看起来像

validate(code); 
process(code); 

验证会抛出失败异常,在这种情况下过程将永远不会达到。

+0

但是,这是不是假设代码将在发生异常时完全终止?如果不是,代码将如何返回到主控制台循环?编辑:我明白你在说什么。没有抓住暗示的尝试块。 – wyatt 2010-12-13 21:28:14

+1

'while(!quit){try {process_command_line(); } catch(const std :: exception&ex){cout <<“Error:”<< ex.what()<< endl; }}' – 2010-12-13 21:31:36

+0

+1的第一段。验证代码很容易用返回代码来设置,而处理代码可能很容易在几层以内,返回代码很尴尬。 – 2010-12-13 21:32:35

4

如果操作可 - 设计 - 在布尔值,无论是成功或失败,而这两个都是常见的,这可能是最清楚的结构的错误检查“明确”这样的方式您的命令流,像“验证”功能。

如果您不想打扰您的常规控制流程,并且错误检查并希望将检查移动到其他地方,也许是上面的某些函数调用级别,那么异常派上用场。

你的情况听起来好像你并不真正需要的例外。如果你的代码看起来干净,没有他们,和它呆在一起。

2

也许你想你的顶级环路是这个样子:

while (!quit) { 
    try { 
     process_command_line_input(); 
    } 
    catch (const std::exception& ex) { 
     std::cerr << "Error: " << ex.what() << std::endl; 
    } 
} 

所以,process_command_line_input()获取输入的下一行,为所欲为它。如果检测到任何错误,则抛出异常,顶级循环显示它,然后继续下一个输入行。

0

没有一个正确的答案。
它是高度依赖于代码和情况:

在你的情况上面的简单的代码(如果withing我自己的类),则错误代码是罚款:

class MyClass 
{ 
    public: 
     void processesValidCodesOrIgnore(int code) 
     { 
      if (validate(code)) 
      { 
       processesCode(code); 
      } 
     } 
    private: 
     bool validate(int); 
     void processesCode(int); 
}; 

由于validate方法是私人的我知道它的结果总是会被检查并且不被忽略,所以在这种情况下它很容易使用错误代码。

另一方面,如果验证是公开的,我肯定会考虑使用异常(取决于使用情况)。因为这会迫使主叫方主动检查问题而不是默默地忽略它们。