C++良好的错误处理方法

jvi*_*tti 3 c++ exception

我开始用C++编写一些代码,我从一个简单的任务管理器程序中得到了这个简单的类方法,我正在编写一个实验:

void Task::setText(string text)
{
    if(text.length() > MIN_LENGTH)
    {
        this->text = text;
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,此方法将class text属性设置为传递给方法的属性,如果它的长度高于MIN_LENGHT我所显示的代码上方定义的变量.因此,如果传递给方法的字符串的条件没有评估为true,我必须做一些事情.

在我买的C++书中,没有解释错误处理,而只是assert在任何地方使用它.因为如果表达式为false,断言只是中止程序,并且这是作为输入验证,我寻找更好的方法.

这次搜索引发了我对C++的例外.它解释了如何通过创建继承的类来创建异常exception.

良好的OOP实践表明,每个班级应该独立于该计划中的其他班级.那么我应该在哪里创建我创建的这个异常类?在同一个头文件中我定义了我的Task类?或者它应该在task.cpp我定义类的每个方法的地方?

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

Kir*_*lev 6

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

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

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

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

  • 虽然我同意这个答案,但我想指出`assert`用于识别PROGRAMMER错误(比如,除非代码有错误,否则应该发生的事情),因为它们在发布时编译时被禁用,当异常应该是用于处理来自用户的错误.在你的情况下,你应该问的问题是"如果字符串比它应该更短,它是一个错误吗?还是因为用户键入错误的东西,或者因为文件不存在等而发生" (2认同)