Что я должен вернуть за ошибки в моих функциях в C? - PullRequest
4 голосов
/ 07 февраля 2010

В настоящее время я возвращаю -1 в своих пользовательских функциях на C, если что-то не так, и 0 для успеха. Например, для работы со связанным списком и некоторыми функциями необходим непустой список для правильной работы. Если список, переданный в качестве аргумента, пуст, я возвращаю -1 (ошибка) и 0, если он не пустой и функция работала без проблем.

Должен ли я, возможно, вернуть 1 вместо -1?

Это стандартный способ ведения дел в C или вы рекомендуете другой подход?

Ответы [ 4 ]

8 голосов
/ 07 февраля 2010

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

if(func_call())
{
    doErrorHandling();
}

Это соглашение позволит вам использовать любое значение !0 для указания конкретной ошибки, и это позволит вам использовать одну переменную единообразным образом. Таким образом, тело if, показанного в примере выше, может иметь инструкцию switch для обработки определенных ошибок.

Вы можете сделать это по-другому - но если вы решите сделать это, придерживайтесь соглашения - API-интерфейс win32 (и другие используемые мной API), к сожалению, смешивают и сопоставляют соглашения.

2 голосов
/ 07 февраля 2010

Звучит хорошо. -1 используется в функции ввода / вывода, потому что положительное возвращаемое значение обычно означает успех и является количеством байтов, которые были обработаны. Если у вас есть несколько способов, с помощью которых функция может работать неправильно, вы можете либо вернуть разные целые числа, либо установить глобальную переменную ошибки (errno используется стандартной библиотекой) для хранения кода ошибки.

С точки зрения стиля я предпочитаю не возвращать коды состояния, поскольку это означает, что мои функции не могут (чисто) возвращать что-либо еще. Вместо этого я бы проверил ввод перед вызовом функции. Но это субъективно и зависит от контекста.

0 голосов
/ 07 февраля 2010

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

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

0 голосов
/ 07 февраля 2010

Есть много схем - но что бы вы ни делали, делайте это последовательно!

Если у вас не так много неудачных условий, просто используйте 0 для ошибки. Это потому, что тесты ошибок написаны простым способом:

if (!list_insert(...)) { handle_error; }

В противном случае лучше использовать отрицательные ответы вместе с обычными ответами> = 0. Это можно использовать для таких функций, как длина списка, которая в обычных условиях не будет отрицательной. Или, если вам нужно много кодов ошибок (-1 - не существует, -2 - не найдено, -3 ..., ...)

...