C++throw异常处理

#include<fstream>#include<stdexcept>#include<iostream>usingnamespacestd;voidread(){if... #include<fstream>
#include<stdexcept>
#include<iostream>
using namespace std;
void read()
{
ifstream infile("D:\\test.txt");
if(!infile)
{
throw runtime_error err("can't open file");
}

}

int main()
{
try
{
read();
}
catch(runtime_error err)
{
cout<<err.what();
}
return 0;
}
显示编译错误error: expected primary-expression before 'err'|
error: expected ';' before 'err'|
1.为什么
if(!infile)
{
runtime_error err("can't open file");
throw err;
}
就没有错误?
2.我试了一下throw int b;也会出现同样的错误,throw b就没问题
3.如果说throw后面不可加定义变量的表达式,那为什么书上的runtime_error ("can't open file");就没有问题,这条语句不也定义了一个临时变量吗?
哪位大侠帮帮忙!万分感谢!
展开
 我来答
yuantailing
推荐于2017-11-25 · TA获得超过2545个赞
知道小有建树答主
回答量:1167
采纳率:92%
帮助的人:649万
展开全部

throw后面跟一个变量或常量,所以不能写

throw runtime_error err("can't open file");

应该是

		runtime_error err("can't open file");
throw err;

 即先把err构造出来,然后throw。

追问
非常感谢你的回答!但我还想问
runtime_error ("can't open file");为什么可以,它也定义了一个临时变量。为什么这个可以边定义边throw?
追答

你这语法就不通,你见过函数写return int a(1)的吗?return int(1)是可以的,意思是用1来初始化一个int类型的临时变量。throw也是一个道理,可以用"can't open file"来初始化runtime_error类型的临时变量,应该写

throw runtime_error("can't open file");
zjfaok
2013-07-17 · TA获得超过6805个赞
知道大有可为答主
回答量:4146
采纳率:62%
帮助的人:1587万
展开全部
throw后面不可加变量定义,但返回临时变量的构造函数调用不是变量定义……
就如double a(123)/4;不是合法的语句,而double(123)/4;则是合法的……
追问
非常感谢你的回答!
那么返回临时变量的构造函数,runtime_error ("can't open file");是什么呢?
追答
可以理解成将字符串"can't open file"显式转换成一个runtime_error对象……
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友3ea40ca46
2013-07-17 · TA获得超过243个赞
知道小有建树答主
回答量:214
采纳率:0%
帮助的人:125万
展开全部
runtime_error ("can't open file")

这个意思是匿名对象
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式