Скажите, что у Вас есть перечисление, которое представляет код ошибки. Будет несколько кодов, каждый с их собственным базовым международным значением; однако, перечисление значений, которое получает значение по умолчанию 0 значений, кажется, что это нужно тщательно рассмотреть.
В случае перечисления кода ошибки существует два специальных значения, о которых я могу думать: Ни один (для случаев, когда нет никакой ошибки) и Неизвестный (для случаев, когда никакой существующий код ошибки не является соответствующим, или возможно даже когда состояние ошибки не может быть обнаружено).
Одно из этих значений кажется, что должно добраться 0, где другой, вероятно, получит что-то еще как-1. Действительно ли более уместно установить значение Ни одного к 0, или Неизвестное значение к 0?
public enum ErrorCode
{
None = -1,
Unknown = 0,
InsufficientPermissions,
ConnectivityError,
...
}
public enum ErrorCode
{
Unknown = -1,
None = 0,
InsufficientPermissions,
ConnectivityError,
...
}
Мой инстинкт говорит мне, что значение по умолчанию должно быть Неизвестным, но мне любопытно, если кто-либо сделал это по-другому.
Определенно не лучшая практика. Но если нет другого пути ... тогда я бы обычно выбрал второй вариант:
public enum ErrorCode
{
Unknown = -1,
None = 0,
InsufficientPermissions,
ConnectivityError,
...
}
0 подходит для соглашения «Нет ошибок» и -1 подходит для понимания того, что есть некоторая ошибка (которая может быть неизвестный).
То же самое со всеми ответами «Я бы не стал этого делать», но если вы настаиваете, вот мои 0,02 доллара.
ErrorCodes.None
не имеет смысла, поскольку ошибки нет. ErrorCodes.Unknown
бесполезен. Попробуйте вернуть код ошибки, допускающий значение NULL:
public ErrorCode? DoFoo()
Теперь вы можете проверить наличие NULL
var error = DoFoo();
if (error != null)
// react
Все еще плохо, но, по крайней мере, он позволяет вам , а не , возвращать код ошибки, если ошибки нет.
Код ошибки неверный. Исключения хорошие. Но чтобы ответить на заданный вопрос:
Если ваше перечисление имеет значение «Неизвестно», оно должно быть значением по умолчанию.
Поскольку вы помечаете свой вопрос рекомендациями: не используйте коды ошибок, если вы можете использовать исключения.
Думаю, я не согласен со всеми по этому поводу.
Нет ничего плохого в кодах ошибок, когда они используются в смысле « каково текущее состояние этой функции. »
Чтобы составить пример: если у вас есть дополнительная сетевая временная папка, к которому вы хотите получить доступ, и вы хотите отобразить результаты за последний раз, когда вы пытались получить к нему доступ, вы должны сохранить это в коде ошибки. Возможно, в строке состояния вы хотите показать текущее состояние пользователю.
Я бы использовал значение None как 0 по умолчанию. Я не вижу причин делать Неизвестное отрицательным. Неизвестно - это совершенно нормальное состояние ошибки. Вы можете просто поставить его в конец списка. На практике я сделал
public enum ErrorCode
{
None = 0,
InsufficientPermissions,
ConnectivityError,
...
Unknown,
}
И чтобы ответить на ваш вопрос, я говорю Ни один не должен быть значением по умолчанию . «Нет» означает: ошибки, о которой вы знаете, не существует. Неизвестный для меня означал бы: существует ошибка, настолько непонятная, что вы не можете учесть ее в своем коде.
Прежде всего, у вас не должно быть кода ошибки "Нет". Вместо этого назовите это «Успех».
А теперь подумайте, как вы собираетесь проверять код ошибки. Большинство людей ожидают чего-то вроде этого:
if (errorCode != Success)
или используют сокращение
if (errorCode != 0)
. Итак, вот оно. Ваш Успешный код равен 0, у вас нет кода Нет, а Неизвестным может быть все, что вы хотите.
Зачем вообще возвращать значение ErrorCode, если ошибки нет?
Не имеет большого смысла. Удаление этого решит вашу проблему. Вы можете просто поставить 0 для Unkown:
public enum ErrorCode
{
Unkown = 0,
InsufficientPermissions,
ConnectivityError
}
UPDATE
Ваш комментарий немного пугающий. У вас никогда не должно быть метода, возвращающего тип ErrorCode. Это очень плохая практика. Поскольку ErrorCodes следует возвращать только в исключительных случаях, рекомендуется создавать исключения.
Если хотите, вы можете иметь поле в вашем особом исключении, которое содержит значение ErrorCode.
На мой взгляд, и Неизвестно
или Ни один
не означает то же самое в контексте перечисления ErrorCode
. Я считаю, что если я проверяю код ошибки, то это потому, что у меня уже есть ошибка.
Я также считаю, что перечисление кодов ошибок полезно только в настраиваемом исключении или в качестве настраиваемых данных существующего типа исключения, и в обоих сценариях всегда будет ошибка.