在哪里检查错误以及如何检查

where to check for the error and how

本文关键字:检查 何检查 错误 在哪里      更新时间:2023-10-16

我有一个代码设计问题。我的问题是我应该把我的用户错误处理代码放在哪里,以及我应该使用什么方法。

这种情况是,我的用户应该向函数提供一个文件名,然后该函数尝试打开文件并对其进行操作。如果文件不存在,我想通知用户,并使用新输入的文件名重试。据我所知,对于这种情况,std异常处理不是一个合适的解决方案。现在我相信我有几个选择;在调用函数之前检查文件是否存在,检查它是否存在于函数中并返回true-false以指示它是否成功,或者如果没有调用打印消息并允许在返回到原始函数之前更改名称的函数,则检查它是否在文件中存在。

以下哪种方法是首选的,为什么,我应该使用更好的替代/lib功能吗。

提前谢谢,如果问题无关紧要,我很抱歉,但我喜欢尝试把这些事情做好。

通常,您应该在获得文件名后尝试打开文件,如果失败则循环。函数应该采用std::istream&,而不是文件名。至少在你展示的小场景中是这样。或者,函数可以获取文件名,并返回一个错误代码,指示是否无法打开文件。在某些情况下(不是很常见,但确实存在),使用异常的替代方案有更多的缺点,因此异常将是最合适的解决方案。

我不会轻易忽略异常,并说它们不合适。它只是取决于整体设计——例如,您的客户端是否启用了异常处理。您可以构建异常类层次结构,比如说CFileException(继承自std::exception),然后是CFileNotFoundExceptionCFileAccessDeniedException。。。等等…继承自它。如果您的客户乐于处理这种类型的异常,请使用它们!您可以在异常对象中传递比错误代码中更多的关于错误的信息,而且您的客户端可以决定在哪里处理该异常。

另一种解决方案是针对不同的错误返回不同的错误代码。不要只返回true/false,它不会向客户端提供太多信息(为什么函数失败)。客户端需要测试错误代码,并相应地向用户生成消息(错误描述、错误原因)。如果使用异常,则可以在失败的函数中创建该消息,该函数是包含有关错误及其性质的更多信息的上下文,因此可以创建更具描述性的消息。

关于将函数分解为更小的函数:您说"函数然后尝试打开文件并对其进行操作",因此有两个单独的函数是值得的-一个打开文件,另一个处理文件。适用于异常/错误的相同规则-如果打开文件失败,将引发异常,第二个不会输入。

如果您需要函数的特定输入,您应该始终检查函数内部的参数,如果意外参数会导致意外行为,除非您试图构建高性能应用程序。这就是<stdexcept>std::invalid_argument的作用。

当然,你应该始终努力确保你为你的程序提供的论据是正确的。但是,如果你的功能可以告诉你目前出现了问题,那也不会对你造成伤害。由于您的程序无法读取std::cout,您必须坚持异常或返回错误代码。

#include <iostream>
#include <fstream>
#include <stdexcept>
#include <string>
void myFunction(const std::string& inputFileName){
    std::ifstream myFile(inputFileName.c_str());
    if(!myFile.good())
        throw std::invalid_argument("The file does not exist!n");
    /* other operations */
}
int main(){
    std::string userInput;
    std::cin >> userInput;
    while(userInput != "quit"){
        try{
            myFunction(userInput);
        }catch(const std::invalid_argument& e){
            std::cout << e.what();
        }
        std::cin >> userInput;
    }
    return 0;    
}
/* this code is just a small example and could be improved */