在哪里检查错误以及如何检查
where to check for the error and how
我有一个代码设计问题。我的问题是我应该把我的用户错误处理代码放在哪里,以及我应该使用什么方法。
这种情况是,我的用户应该向函数提供一个文件名,然后该函数尝试打开文件并对其进行操作。如果文件不存在,我想通知用户,并使用新输入的文件名重试。据我所知,对于这种情况,std异常处理不是一个合适的解决方案。现在我相信我有几个选择;在调用函数之前检查文件是否存在,检查它是否存在于函数中并返回true-false以指示它是否成功,或者如果没有调用打印消息并允许在返回到原始函数之前更改名称的函数,则检查它是否在文件中存在。
以下哪种方法是首选的,为什么,我应该使用更好的替代/lib功能吗。
提前谢谢,如果问题无关紧要,我很抱歉,但我喜欢尝试把这些事情做好。
通常,您应该在获得文件名后尝试打开文件,如果失败则循环。函数应该采用std::istream&
,而不是文件名。至少在你展示的小场景中是这样。或者,函数可以获取文件名,并返回一个错误代码,指示是否无法打开文件。在某些情况下(不是很常见,但确实存在),使用异常的替代方案有更多的缺点,因此异常将是最合适的解决方案。
我不会轻易忽略异常,并说它们不合适。它只是取决于整体设计——例如,您的客户端是否启用了异常处理。您可以构建异常类层次结构,比如说CFileException
(继承自std::exception
),然后是CFileNotFoundException
、CFileAccessDeniedException
。。。等等…继承自它。如果您的客户乐于处理这种类型的异常,请使用它们!您可以在异常对象中传递比错误代码中更多的关于错误的信息,而且您的客户端可以决定在哪里处理该异常。
另一种解决方案是针对不同的错误返回不同的错误代码。不要只返回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 */
- valgrind-hellgrind与泄漏检查的结果不同
- C++模板来检查友元函数的存在
- 检查输入是否不是整数或数字
- 试图让变量检查数组中的某些内容
- 检查值是否在集合p1和p2中,但不在p3中
- C++概念:如何使用'concept'检查模板化结构的属性?
- 概念TS检查忽略私有访问修饰符
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- 如何在C++中检查2D数组中负值的输入验证
- C++:正在检查LinkedList中的回文-递归方法-错误
- 使用for循环检查数组中的重复项
- 如何检查一个c++字符串中有多少相同的字符/数字
- 检查不带转换的扫描格式
- 如何检查线程是否锁定
- 清除前检查矢量
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- C++LDAP检查用户是否是特定组的成员
- 我如何循环循环switch语句检查重新检查char?(C )
- Visual Studio - 如何从 C++ 核心指南检查器检查路径中排除文件夹