例外与错误

时间:2011-05-13 01:12:02

标签: c++ c exception errno

作为一名C程序员,我对异常没有多少经验。我习惯于errno作为跨多个函数调用传递错误的方法。话虽如此,我没有看到例外的显着特征,所以......

例外和使用errno之间的根本区别是什么?

6 个答案:

答案 0 :(得分:3)

这里有很多不同之处,很难说从哪里开始。

首先,C中使用的errno是一个全局变量;这意味着调用errno - 设置子例程的每个例程必须在执行任何其他工作之前检查errno,如果它关心正确性。幸运的是,errno is threadsafe

C ++异常会自动展开调用堆栈,直到找到准备处理错误的函数。这意味着在大多数情况下,用户不必明确检查每个错误调用;相反,他们可以在一个地方收集错误。与errno不同,C ++异常可以包含除整数之外的值。

答案 1 :(得分:3)

你可以随便忽略错误。必须处理例外情况。

当然,我已经看到了我的份额:

try {
   // something
}
catch( ... ) {
   // nothing
}
// continue as if nothing happened

和(Java)

try {
   // something
}
catch( Throwable t ) {
   // nothing
}
// continue as if nothing happened

但是当你翻看其他人的烂摊子时,至少那种情况会向你跳出来。

答案 2 :(得分:3)

我不得不指出,面对异常编写正确的程序并不容易。您最好对该主题进行一些研究,可能从Guru of the Week开始。只需查找单词exception

答案 3 :(得分:2)

1)异常可以是任何东西,而不仅仅是整数。所以传达的数据是不同的。

2)异常执行非本地控制流程,因此您不必以实际使用errno的方式检查每个级别,还会返回一个指示错误的值,并且每个调用者都会检查如果发生错误并提前解决问题。相反,错误返回执行本地控制流,因此您始终可以确切地查看错误通过给定代码段传播的时间。这种差异从根本上改变了编码风格。所以沟通方式也不同。

答案 4 :(得分:2)

对我来说,最重要的区别是errno很容易被忽略,而异常很难被忽略 - 如果你最终忽略它们,程序将会终止......另外,例外是(好吧,应该be)对象,所以你可以携带更多有用的信息。

另一个非常重要的区别是,在软件实际上可以做出明智决定如何处理问题的时候,可以很容易地处理异常,这通常是调用堆栈的几个级别。这对于错误代码来说并不容易。

答案 5 :(得分:1)

我发现在嵌入式系统中有用的一种模式是为每个流设置一个错误标志,但是规定在设置标志时尝试的I / O操作将立即失败。因此,代码可以执行以下操作:

  pkt_type = tcp_getbyte(my_stream, timeout);
  pkt_length = tcp_getbyte(my_stream, timeout);
  pkt_length |= tcp_getbyte(my_stream, timeout) << 8;
  if (pkt_length < MAX_PACKET_LENGTH)
  {
    for (i=0; i<pkt_length; i++)
      buffer[i] = tcp_getbyte(my_stream, timeout);
  }
  if (!my_stream->error)
  {
    /* Do something with packet */
  }

如果一次尝试获得一个字节超时,则成功尝试将无条件失败,返回零。没有必要检查每个操作是否失败;如果出现问题,系统最终会表现得像tcp_getbyte()抛出一个异常一样,只是不那么快。