2012-10-05 84 views
3

我开始用C++写一些代码,我有一个简单的任务管理器程序我正在写做实验这个简单的类方法:C++良好的错误处理方法

void Task::setText(string text) 
{ 
    if(text.length() > MIN_LENGTH) 
    { 
     this->text = text; 
    } 
} 

正如你所看到的,如果该方法的长度高于在我已展示的代码上方定义的MIN_LENGHT变量,则此方法将类text属性设置为传递给该方法的属性。所以我必须做一些事情,如果条件不传递给方法的字符串评估为true。

在我购买的C++书籍中,错误处理没有解释,而是它只是在全球各地使用assert。如果表达式为false,断言程序会中止程序,并将其作为输入验证,我寻找更好的方法。

该搜索引导我到C++ exceptions。在那里它解释了如何创建一个继承自exception的类来创建异常。

良好的面向对象操作规范说每个类都应该独立于程序中的其他类。那么我应该在哪里创建这个异常类?在同一个头文件中,我定义了我的Task类?或者应该在task.cpp中定义每个类的方法?

也许这是一个愚蠢的问题,但只是想要安全并从一开始就遵循一个好的软件架构实践。

+1

“我没有做你所要求的”与“你搞砸了”不一样。传递的字符串太短,可能会终止程序?您首先必须决定在这种情况下呼叫方应该做些什么。然后你可以考虑如何传输必要的信息。 –

回答

6

建议#1:你需要完全读你的书。

如果发生错误,您应该抛出异常。每1000次调用函数/方法时,异常发生的次数会少一些。在这里1000不是一个魔术值,特别是其他数字可能是合适的。

换句话说。您需要回答的第一个问题:这种错误发生的频率。如果这可能经常发生,那么返回值(bool或枚举或int)是更好的方法。

如果您决定使用异常,最好从std::exception中派生出来。您应该将项目的例外情况置于单独的文件中。想想几个班,也许3-10。最好在你的异常类中放置一个数据字段,它应该解释所发生的事情的细节,而不是创建数百个不同的异常类。

+2

虽然我同意这个答案,但我想指出''assert'用于识别PROGRAMMER错误的目的(比如,除非代码错误,否则不应该发生的事情),因为它们在发布时编译时被禁用,应该用来处理来自用户的错误。在你的情况下,你应该问的问题是“如果字符串比它应该短,是错误还是可以发生,因为用户输入了错误的东西,或者因为文件不存在等。” – qdii

+0

+1,建议少用例外。而且,如果可以的话,另一个+1用于推荐它们在单独的标题中定义。您应该仔细考虑适用于您的程序的错误类别,并创建捕获它们的极少数的异常类。你应该从':: std :: exception'或者它的一个子分类派生,比如':: std :: invalid_argument'。 – Omnifarious

+0

@qdii:关于'assert'的优点。恐怕我的编辑模糊了这样一个事实,即原始文章似乎有点含糊不清为什么条件可能会失败。 OP在几处提到了“验证”,所以我假设了“输入验证”。 – Omnifarious

0

C++标准库提供了许多可以使用的exception类。开始时,您可以使用它们。在你的情况下,似乎是range error
如果你仍然想实现你自己的异常类,你声明和实现它应该取决于他们的代码。如果他们编写了一个类特定的错误,你可以把它们放在你的类文件中。如果你必须从多个文件中使用它们,把它们放在它们自己的.cpp/.hpp对中。

1

异常类可以在单独的.h .cpp文件中。这样你可以重用其他东西。

至于我自己的经验法则:

断言是事情不应该发生,但我们检查只是为了确保100%地肯定

例外是错误处理的事情时,你的程序是可以发生在生产