【发布时间】:2012-10-10 07:16:41
【问题描述】:
try-catch 块是否捕获分段错误错误?
我正在使用下面给出的函数读取文本文件,但有时文件为空并且程序崩溃。我希望程序继续运行并在此文件为空或正在使用时提供另一个文件。
Path2D read_gesture(const char* filename)
{
Path2D path;
//MultiStrokeGesture MultiStrokes;
vector<string> text_file;
int no_of_paths=0;
std::ifstream ifs(filename);
for (std::string line; std::getline(ifs, line); )
{
no_of_paths=no_of_paths+1;
double a, b;
stringstream ss(line);
if (!(ss >> a >> b)) {cout<<"wrong format"<<endl;}
std::cout << "You said, " << a << ", " << b << ".\n";
path.push_back(Point2D(a,b));
}
cout<<"saving gesture"<<endl;
return path;
}
我尝试了类似的方法:
Path2D path;
try
{
path=read_gesture("test.txt");
}
catch(int e)
{
path=read_gesture("test2.txt");
}
但程序仍然崩溃。可能是什么问题?
- 稍作修正,
catch调用的文件与try调用的文件不一样,是错字。
【问题讨论】:
-
问“如何防止崩溃”是没有意义的。唯一的答案是“编写一个正确的程序”。
-
catch(int e)不会像std::exception这样捕获 c++ 异常,它会捕获整数 -
您应该修复异常的来源,而不是试图捕捉它。如果您的程序中有分段错误,那么您是最有可能的原因。 (不是想对你刻薄,这是最可能的原因。:))
-
如果
read_gesture可能产生异常并且在catch 块中,你应该在那里还有另一个try-catch 块,以此类推......尝试做一些不同的事情(那不是' t 生成异常!) -
您在
try和catch块中调用相同的代码。如果您确实捕获了异常,则说明发生了严重错误,因此您应该最后做的事情就是再次做同样的事情。异常处理是关于保留控制权并纠正问题或优雅退出。这就是精神错乱的定义:一遍又一遍地做同样的事情,却期待不同的结果。
标签: c++ crash segmentation-fault