Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在哪里检查错误以及如何检查错误_C++_Error Handling - Fatal编程技术网

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

C++ 在哪里检查错误以及如何检查错误,c++,error-handling,C++,Error Handling,我有一个代码设计问题。 我的问题是我应该把用户错误处理代码放在哪里,我应该使用什么方法 情况是这样的,我的用户应该为一个函数提供一个文件名,然后这个函数尝试打开文件并对其进行操作。如果文件不存在,我想通知用户,并用新输入的文件名重试。据我所知,std异常处理不适合这种情况。 现在我相信我有两个选择;在调用函数之前检查文件是否存在, 检查它是否存在于函数中并返回true false以指示它是否成功,或者如果没有调用打印消息并允许在返回原始函数之前更改名称的函数,则检查它是否存在于文件中 以下哪种方

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

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

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


如果问题无关紧要,请提前向您表示感谢和歉意,但我喜欢尝试正确处理这些问题。

如果您需要函数的特定输入,除非您尝试构建高性能应用程序,否则如果意外参数将导致意外行为,您应该始终检查函数内部的参数。这就是
中的
std::invalid_参数的作用

当然,您应该始终尝试确保为过程提供的参数是正确的。但是如果你的函数能告诉你当前有什么地方出了问题,这对你并没有坏处。由于您的程序无法读取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 */
#包括
#包括
#包括
#包括
void myFunction(const std::string和inputFileName){
std::ifstream myFile(inputFileName.c_str());
如果(!myFile.good())
抛出std::无效的_参数(“文件不存在!\n”);
/*其他业务*/
}
int main(){
std::字符串用户输入;
std::cin>>用户输入;
while(userInput!=“退出”){
试一试{
myFunction(用户输入);
}catch(const std::无效的参数&e){
std::cout>userInput;
}
返回0;
}
/*这段代码只是一个小例子,可以改进*/

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

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


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

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

为什么您认为异常处理不合适?当您说用户为函数提供了文件名时,您的意思是文件名是函数的参数,还是函数一旦运行,即ks代表并接受文件名?我认为std异常处理不是针对运行时错误,如用户输入。文件名是从程序中其他地方的用户获取的参数。@无用:验证用户输入时通常不赞成异常。是否有指向其背后原因的链接?