C++为什么要引入异常机制
一直不明白C++里面的异常主要是用来解决什么问题 在一般的编程过程中好像也很少用到 而且有的书上把异常与goto语句看待不建议使用 大家赐教
[解决办法]
先查查异常的作用
我是很少用到,当出现异常时,程序要么直接当掉,要么会不继续异常后的代码(就会导致很多问题如资源泄漏等等。。),因此我觉得能捕获异常是很人性化的。
[解决办法]
一般来说比较大的程序,对待错误处理有两种模式:
1. 返回错误码,基本上所有的程序都返回一个错误码(一般用int),来标识函数是否执行正确;然后函数调用者都要判断一下返回值是不是0(一般成功执行的标识)。理论上所有的函数调用都必须要判断一下这个返回值。所以,你懂得,程序里面就会有一堆的if…else… ,每个错误分支打印一条日志,再向上层返回错误码。
很麻烦,但是很多大公司的老项目(或者公司的老人们)都是使用这种模式……
2. 异常处理,函数调用不用再检查返回值,而且可以在很高层捕获异常,而不用每层都检查,向高层返回;而且可以根据不同的异常类型,进行不同的处理;比错误码方式灵活的多。
但是如果你忘记捕获异常了,那你就悲剧了,程序直接core了,这个是非常非常严重的线上问题,基本上kpi是扣定了。
这两种方法都有公司在用,我知道google,百度使用错误码,阿里云用异常处理。
google的编码规范对这个说的比较清楚,可以找一下规范看看。
你可以根据你自己的项目权衡,不过一个全新的项目,推荐用异常。
[解决办法]
异常是用来简化错误处理的.
因为异常有类型,所以可以方便的进行分层处理.而且异常可以携带更丰富的信息,方便错误的定位处理.异常可以无视正常的程序流程,在有复杂调用层次关系的时候,这可以极大简化错误处理,而不用一层一层的退出.
这些都是异常的初衷,但在C++里,异常并不成功.
它有上面优势的同时,也有很多缺点.比如:
编写异常安全的代码就是一件比较考验功力的事.因为C++并不管是异常友好的,很多异常相关的动作要人为配合.
C++中的异常没有标准实现,很难实现跨模块的异常.这对大型项目是个巨大的限制.
异常是性能相当低下的一种机制,而C++的多数应用场景都是性能敏感的,以及C++程序员天生的性能敏感性.这极大的限制了异常的应用.
异常无视正常程序流程,给错误处理带来便利的同时,也带来了极强的穿透性.很难把异常限制在一个小范围内处理,这要求在系统的整体架构上对异常的处理有所考量.
[解决办法]
几乎没用过
[解决办法]
程序健壮性所需要的
[解决办法]
至少在本人做过的东西里面,没有发现异常处理的作用。
我认为,当系统需要trycatch机制的时候,就不应当使用C++做。那样的系统应当用Java什么的做。
另外,还可以使用callback的模式处理异常。
[解决办法]
c++ 语言的设计和演化
[解决办法]
捕捉程序出错的地方,进行处理的吧
[解决办法]
是很少用到啊~~
[解决办法]
健壮性。当你出错的时候就比较容易找到原因啦
[解决办法]
去看C++之父亲自写的《C++语言设计与演化》,如果有答案就有答案了。
如果没有,也就没必要讨论了。
[解决办法]
字符串读(读取一行字符串) LPTSTR CArchive::ReadString(LPTSTR lpsz, UINT nMax)
{
// if nMax is negative (such a large number doesn''t make sense given today''s
// 2gb address space), then assume it to mean "keep the newline".
int nStop = (int)nMax < 0 ? -(int)nMax : (int)nMax;
ASSERT(AfxIsValidAddress(lpsz, (nStop+1) * sizeof(TCHAR)));
_TUCHAR ch;
int nRead = 0;
TRY
{
while (nRead < nStop)
{
*this >> ch; //读出一个字节
// stop and end-of-line (trailing ''/n'' is ignored) 遇换行—回车
if (ch == ''/n'' || ch == ''/r'')
{
if (ch == ''/r'')
*this >> ch;
// store the newline when called with negative nMax
if ((int)nMax != nStop)
lpsz[nRead++] = ch;
break;
}
lpsz[nRead++] = ch;
}
}
CATCH(CArchiveException, e)
{
if (e-> m_cause == CArchiveException::endOfFile)
{
DELETE_EXCEPTION(e);
if (nRead == 0)
return NULL;
}
else
{
THROW_LAST();
}
}
END_CATCH
lpsz[nRead] = ''/0'';
return lpsz;
}
如上程序所示,异常处理机制首先是为了保证程序的鲁棒性;
其次,为了满足每个人对于所编写的程序出现的异常进行个性化的处理,从而提高了程序功能;
再者,程序员可以对自己所编写的程序所出现的BUG进行一些提示和额外的修正“出现错误不要紧,能够自己在用户碰到错误之前就已经将其解决掉是最好的”。