Исключения против errno - PullRequest
3 голосов
/ 13 мая 2011

Как программист на Си, у меня нет большого опыта работы с исключениями.Я скорее привык к errno как средство сообщения об ошибках через несколько вызовов функций.Тем не менее, я не вижу отличительной черты исключений, так что ...

В чем принципиальная разница между исключениями и использованием errno?

Ответы [ 6 ]

3 голосов
/ 13 мая 2011

Я чувствую себя обязанным указать, что написание правильных программ перед лицом исключений нелегко.Вы хорошо проводите исследования по этому вопросу, возможно, начиная с Гуру недели .Просто найдите слово exception.

3 голосов
/ 13 мая 2011

Вы можете случайно проигнорировать errno. Исключения должны быть рассмотрены.

Конечно, я видел свою долю:

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

и (Java)

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

НО, по крайней мере, что-то вроде этого выпрыгивает на вас, когда вы боретесь с чужим беспорядком.

3 голосов
/ 13 мая 2011

Здесь так много различий, что трудно сказать, с чего начать.

Прежде всего, errno, как используется в C, является глобальной переменной;это означает, что каждая подпрограмма, которая вызывает подпрограмму с настройкой errno, должна проверять errno перед выполнением любой другой работы, если она заботится о корректности.К счастью, errno является поточно-безопасным .

C ++ исключения автоматически разматывают стек вызовов, пока не найдут функцию, подготовленную для обработки ошибки.Это означает, что в большинстве случаев пользователям не нужно явно проверять каждый вызов на наличие ошибок;вместо этого они могут собирать сообщения об ошибках в одном месте.Исключения C ++ могут содержать значения, отличные от целых, в отличие от errno.

2 голосов
/ 13 мая 2011

Для меня самое важное отличие в том, что errno легко игнорируется, тогда как исключения довольно трудно игнорировать - программа завершится, если вы в конечном итоге проигнорируете их ... Плюс, исключения есть (ну, должно быть) объекты, так что вы можете нести более полезную информацию.

Другое, очень важное отличие состоит в том, что исключения могут легко обрабатываться в момент, когда программное обеспечение действительно может принять обоснованное решение о том, как решить проблему, которая обычно на несколько уровней выше стека вызовов. Это не так просто сделать с кодами ошибок.

2 голосов
/ 13 мая 2011

1) Исключениями может быть что угодно, а не только целое число.Таким образом, передаваемые данные отличаются.

2) Исключения делают нелокальный поток управления, поэтому вам не нужно проверять на каждом уровне, как на практике с errno, вы также возвращаете значениеэто указывает на ошибку, и каждый вызывающий проверяет ошибки и выручает рано, если они произошли.И наоборот, возврат ошибок приводит к локальному потоку управления, поэтому вы всегда можете точно увидеть, когда ошибки распространяются через данный фрагмент кода.Эта разница в корне меняет стиль кодирования.Значит, способы общения тоже разные.

1 голос
/ 13 мая 2011

Один шаблон, который я нашел полезным во встроенных системах, состоит в том, чтобы иметь флаг ошибки для каждого потока, но при условии, что операция ввода-вывода, которая предпринимается при установке флага, немедленно завершится неудачей.Таким образом, код может сделать что-то вроде:

  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 () выдал исключение, но не так быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...