异常与错误有什么区别?

foxbillcsdn 2004-10-10 09:20:10
以前写程序,对于不正常的情况,通过返回错误代码来鉴别,在C++中是不是可以通过异常来实现?
异常与错误到底有什么区别?一直很疑惑。
...全文
2121 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
sloriver 2004-10-12
  • 打赏
  • 举报
回复
异常用来处理错误的,没异常处理的错误可能会崩溃
sharkhuang 2004-10-12
  • 打赏
  • 举报
回复
因该说异常比错误严重。错误是你可以遇见的错误分支。异常是你不能遇见的
foxbillcsdn 2004-10-12
  • 打赏
  • 举报
回复
btbq(阿不) 和 meijing(水手)讨论的很激烈呀。多谢。
我准备给分了,你们还要深入吗?
foxbillcsdn 2004-10-11
  • 打赏
  • 举报
回复
更正:
有必要使用一查不过来代替吗?
应该为:
有必要使用异常过来代替吗?
foxbillcsdn 2004-10-11
  • 打赏
  • 举报
回复
从meijing(水手) 的来看,解释的比较好。
不过,呵呵,我的问题还有一部分没有解释:
如何把我以前代码中的返回error code的代码该为用异常来处理,而且,
怎么去确定有没有必要改为异常方式?
举个例子:
我现在写了一个xml解析的代码(使用expat),对于正确的xml文档,解析之后返回0,
如果是不正确的xml文档,则返回各种错误代码,比如标签不对称。
有必要使用一查不过来代替吗?
不知道大家在设计过程中是如何处理的?
欢迎大家谈论。
btbq 2004-10-11
  • 打赏
  • 举报
回复
mfc就是一个大家共识的典范,在不同的情况下使用不同的处理(异常、错误)。在一个大工程中被考虑更多的不是细心、技巧等个人熟练、水平问题,而是对系统的效率和结构做权衡。bug是软件的天性,即使全用错误处理代替异常,也必定有bug(特别在大工程的超多层次函数传值中)。
meijing 2004-10-11
  • 打赏
  • 举报
回复
to tbq(阿不) :

2、3都可以人为补救,mfc都会抛出很多异常,但效率(异常与错误)则是人为无法补救的
???

只能说需要“细心”和“技巧”来避免2,3带来的不利影响。
正因为 “需要‘细心’和‘技巧’来避免2,3带来的不利影响”
,所说这是异常的缺点。

如果你真正写过稍微大一点的程序的话,你就知道要完完全全做到是很难的。否则大家
不会有共识:只要是软件,就有bug
meijing 2004-10-11
  • 打赏
  • 举报
回复
to foxbillcsdn(fox):
"如果在出错当时的语境下知道出错后该怎么处理就应该直接处理该错误"
就是这样一个泛泛的准则。

举例来说,假设要写一个将字符串转换成整型数的函数。
显然“字符串不是数字”是一种错误情况, 如“hij”根本就不能转成整型数。
那么此时该抛出异常么?

答案是视情况而定:
1。如果该函数用于某种特殊的用途,如果输入不是数字就用0代替(即"知道出错后该怎么处理"),那么此处应该作为错误处理。函数如下
int str2int(const string& str)
{
int returnValue = 0;
if ( str.isNotDigit() )
{
returnValue = 0;
}
else
{
//正常处理
}
}

2。如果该函数是作为一个库提供给其他用户的,无法确定用户在接受到非法字符串的情况下希望采取的行为(即“不知道出错后该怎么处理”),那么就应该抛出异常。
int str2int(const string& str)
{
int returnValue = 0;
if ( str.isNotDigit() )
{
throw ex();
}
else
{
//正常处理
}
}

不同用户调用该函数时如果catch到异常则根据自己的需要确定处理方法
yingpf 2004-10-10
  • 打赏
  • 举报
回复
异常有时并不是由于你的程序的问题引起的,如用new 申请一个内存块失败时,数据库操作失败时,就会产生一个异常,异常往往是程序的执行过程中不可预料的。如果不对产生的异常进行处理,程序往往崩溃,会使软件显得很脆弱。

错误而言,不管是语法错误,逻辑错误都是可以通过检查发现的。
daylove 2004-10-10
  • 打赏
  • 举报
回复
错误就是错误,

异常是异常,错误更严重!
runall 2004-10-10
  • 打赏
  • 举报
回复
有了异常就可以随时发现错误
wangxiaoxiao2000 2004-10-10
  • 打赏
  • 举报
回复
同意
btbq 2004-10-10
  • 打赏
  • 举报
回复
2、3都可以人为补救,mfc都会抛出很多异常,但效率(异常与错误)则是人为无法补救的
btbq 2004-10-10
  • 打赏
  • 举报
回复
2、3都可以人为补救,mfc都会抛出很多异常,但效率(异常与错误)则是认为无法补救的
meijing 2004-10-10
  • 打赏
  • 举报
回复
to btbq(阿不) :
异常的开销到在其次,更不可小视的是:
2。破坏的程序的结构性。
3。要正确使用异常机制不太容易,有很多需要小心的地方
btbq 2004-10-10
  • 打赏
  • 举报
回复
觉得异常功能比较强,比较关心异常的开销,不敢多用
meijing 2004-10-10
  • 打赏
  • 举报
回复
这个问题说起来可大了,讲一两个小时也不够。
简单说说我的理解:
异常和错误基本上是一样的,区别在于错误是可以预见到并且知道如何处理的情况而异常是指出错了但不知如何去处理的情况。或者说:如果知道出错后该怎么处理就可以直接处理该错误,否则就将其作为一个异常抛出(在知道如何处理地方捕捉该异常然后进行处理)。
c++异常相对返回错误码的优点:
1. 可以强制对该错误进行处理,如果不处理则程序coredump
2. 可以从内层嵌套中直接跳出
3. 代码更简洁
4。会进行堆栈解退
缺点:
1。增加一定的开销
2。破坏的程序的结构性。
3。要正确使用异常机制不太容易,有很多需要小心的地方

据说对于c++异常的争论很多,我想可能就是因为以上缺点吧。(不过我看的书都是鼓吹c++的,所以没能看到反面的意见)。
lamputa_lito 2004-10-10
  • 打赏
  • 举报
回复
至于这个问题。我了解一点,说出来讨教一下。

以前写程序,对于不正常的情况,通过返回错误代码来鉴别
----------------------------------------------------------

以前写程序一般是通过返回错误代码或者设置错误标志位为实现,但是这里有个问题,就是你不能保证用户会去检验这个返回代码或者错误标志位,这样的话程序出错了还继续运行,最终是离出错的地方越来越远。而异常其实就是一个错误信息,如果有异常,而该异常没有被任何程序捕捉的话,程序就会中断。可以更好的让客户诊断错误。

我想以上只不过是使用异常的一个原因。应该还有其他吧,欢迎ding 。
geland 2004-10-10
  • 打赏
  • 举报
回复
在C++中可以通过异常来返回错误代码

playmud 2004-10-10
  • 打赏
  • 举报
回复
异常肯定是错误,错误不一定是异常。
加载更多回复(3)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧