A throw-expression with no operand in C++

本文探讨了C++中使用空抛表达式重新抛出当前正在处理的异常的方法,并解释了这种做法仅适用于catch处理器或从catch处理器内部调用的函数。此外,还介绍了空抛表达式与声明函数不抛出异常的区别。

A throw-expression with no operand re-throws the exception currently being handled. Such an expression should appear only in a catch handler or in a function called from within a catch handler. The re-thrown exception object is the original exception object (not a copy). For example:

try {
    throw CSomeOtherException();
}
catch(...) {  // Handle all exceptions
    // Respond (perhaps only partially) to exception
    // ...
    throw;       // Pass exception to some other handler
}

An empty throw statement tells the compiler that the function does not throw any exceptions. It is the equivalent to using__declspec(nothrow). For example:

// exceptions_trycatchandthrowstatements3.cpp 
void empty() throw()
{
   puts("In empty()");
}

void with_type() throw(int)
{
   puts("Will throw an int");
   throw(1);
}

int main()
{
   try {
       empty();
       with_type();
   }catch (int){
       puts("Caught an int");
   }
}
tpDal/dalTestDmp.cpp: In function ‘int dalTestCfgWithDebug(dal_ado_t*, dal_attr*)’: ../../../../../../src/platform/include/midware/dalAdo.h:940:303: error: second operand to the conditional operator is of type ‘void’, but the third operand is neither a throw-expression nor of type ‘void’ for (tpObjIterInit((_adoi)->option.data.iter,(_adoi)->option.data.kfv),tpObjIterNextKeyBeforeField((_adoi)->option.data.iter);tpObjIterHasNext((_adoi)->option.data.iter)?(TPOBJ_TYPE_IS_FIELD(tpObjIterGetNextValType((_adoi)->option.data.iter))?tpObjIterNext((_adoi)->option.data.iter):tpObjIterNextKey((_adoi)->option.data.iter)),1:0;) ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~ tpDal/dalTestDmp.cpp:86:2: note: in expansion of macro ‘DAL_ADOI_OPTION_LOOP’ DAL_ADOI_OPTION_LOOP(adoi) ^~~~~~~~~~~~~~~~~~~~ In file included from ../../../../../../src/platform/include/midware/opFrame.h:14:0, from tpDal/dalTestDmp.cpp:15: tpDal/dalTestDmp.cpp:323:52: warning: ISO C++ forbids converting a string constant to ‘CHAR* {aka char*}’ [-Wwrite-strings] PFM_IF_FAIL_RET_VAL(dalHandlerUnreg(DAL_MOD_TEST),-1); ^ ../../../../../../src/platform/include/fepPfm.h:100:11: note: in definition of macro ‘PFM_IF_FAIL_RET_VAL’ __rv = (expression); \ ^~~~~~~~~~ tpDal/dalTestDmp.cpp:324:92: warning: ISO C++ forbids converting a string constant to ‘CHAR* {aka char*}’ [-Wwrite-strings] PFM_IF_FAIL_RET_VAL(dalHandlerReg(DAL_MOD_TEST,(val_c==0)?dalTestCfg:dalTestCfgWithDebug),-1); ^ ../../../../../../src/platform/include/fepPfm.h:100:11: note: in definition of macro ‘PFM_IF_FAIL_RET_VAL’ __rv = (expression); \ ^~~~~~~~~~ In file included from ../../../../../../src/platform/include/midware/dal.h:13:0, from tpDal/dalTestDmp.cpp:16: tpDal/dalTestDmp.cpp: In function ‘int dalTestCfg(dal_ado_t*, dal_attr*)’: ../../../../../../src/platform/include/midware/dalAdo.h:940:303: error: second operand to the conditional operator is of type ‘void’, but the third operand is neither a throw-expression nor of type ‘void’ for (tpObjIterInit((_adoi)->option.data.iter,(_adoi)->option.data.kfv),tpObjIterNextKeyBeforeField((_adoi)->option.data.iter);tpObjIterHasNext((_adoi)->option.data.iter)?(TPOBJ_TYPE_IS_FIELD(tpObjIterGetNextValType((_adoi)->option.data.iter))?tpObjIterNext((_adoi)->option.data.iter):tpObjIterNextKey((_adoi)->option.data.iter)),1:0;)
06-26
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值