C++;良好的错误处理方法 我开始用C++编写一些代码,我从一个简单的任务管理器程序中得到了这个简单的类方法,我作为一个实验来写: void Task::setText(string text) { if(text.length() > MIN_LENGTH) { this->text = text; } }

C++;良好的错误处理方法 我开始用C++编写一些代码,我从一个简单的任务管理器程序中得到了这个简单的类方法,我作为一个实验来写: void Task::setText(string text) { if(text.length() > MIN_LENGTH) { this->text = text; } },c++,exception,C++,Exception,如您所见,如果classtext属性的长度高于在我显示的代码上方定义的minu LENGHT变量,则该方法将该属性设置为传递给该方法的属性。因此,如果传递给方法的字符串的条件的计算结果不是true,我必须做一些事情 在我购买的C++书籍中,错误处理没有解释,而是到处使用断言< /代码>。由于assert只是在表达式为false时中止程序,这是为了进行输入验证,因此我寻找了一种更好的方法 这次搜索使我找到了一个新的目标。在这里,它解释了如何通过创建从exception继承的类来创建异常 良好的OO

如您所见,如果class
text
属性的长度高于在我显示的代码上方定义的
minu LENGHT
变量,则该方法将该属性设置为传递给该方法的属性。因此,如果传递给方法的字符串的条件的计算结果不是true,我必须做一些事情

在我购买的C++书籍中,错误处理没有解释,而是到处使用<代码>断言< /代码>。由于assert只是在表达式为false时中止程序,这是为了进行输入验证,因此我寻找了一种更好的方法

这次搜索使我找到了一个新的目标。在这里,它解释了如何通过创建从
exception
继承的类来创建异常

良好的OOP实践表明,每个类都应该独立于程序中的其他类。那么我应该把我创建的这个异常类放在哪里呢?在同一个标题中,我在中定义了我的任务类?还是应该在
task.cpp
中定义类的每个方法


也许这是一个愚蠢的问题,但我只是想确保安全,并从一开始就遵循良好的软件体系结构实践。

C++标准库提供了许多您可以使用的类。首先,你可以使用它们。在您的情况下,适用的似乎是。

如果您仍然想要实现自己的异常类,那么声明和实现它的位置应该取决于它们的代码。如果它们为特定于类的错误编写代码,您可以将它们放在类文件中。如果必须从多个文件中使用它们,请将它们放入它们自己的.cpp/.hpp耦合中。

异常类可以位于单独的.h.cpp文件中。这样你就可以重复使用其他东西了

根据我自己的经验:

断言是针对不应该发生的事情,但我们检查只是为了100%确定

例外情况是当您的程序投入生产时可能发生的错误处理情况

建议1:您需要完整阅读您的书

在每一个错误的情况下,您都应该抛出一个异常,这是不正确的。异常发生的频率应该低于每1000次函数/方法调用一次。1000在这里不是一个神奇的值,特别是在其他数字可能合适的情况下

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


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

“我没有按照你的要求做”与“你搞砸了”不同。传递过短的字符串是否可能导致程序终止?在这种情况下,您首先必须决定呼叫方应该做什么。然后您可以考虑如何传输必要的信息。虽然我同意这个答案,但我想指出,
assert
用于识别程序员错误(例如,除非代码有缺陷,否则永远不会发生的错误),因为在发行版中编译时这些错误是禁用的,何时应使用异常来处理来自用户的错误。在您的情况下,您应该问的问题是“如果字符串比它应该的短,这是一个bug吗?或者它可能是因为用户键入了错误的内容,或者因为文件不存在,等等”+1,以建议节约使用异常。如果可以的话,再加一个+1,建议在单独的标题中定义它们。您应该仔细考虑适合您的程序的错误类别,并创建少量捕获它们的异常类。您应该从
::std::exception
或它的一个子类派生,如
::std::invalid_参数
@qdii:assert。我担心我的编辑掩盖了一个事实,即最初的帖子似乎有点模棱两可,不清楚为什么条件可能会失败。OP在几个地方提到了“验证”,所以我假设是“输入验证”。同意。Assert应该用于检查代码各部分之间的一致性。若程序使用256个元素的表(而不是其他任何东西),则应使用断言来验证这一点。错误是指从外部世界进入程序的所有内容:文件、数据库、网络套接字、用户输入等。外部输入不应导致崩溃。