Обработка исключений с помощью throw c#
Проблема в том что необходимо обработать исключения с помощью выражения throw, я только обучаюсь и нужно выполнить задание с юнит тестами. Задание требует реализовать ArgumentOutOfRangeException c переменными day & month, а также ArgumentNullException c перeменной username
public static string GenerateUserCode(int day, int month, string username)
{
if (day < 1 && day > 31)
{
throw new ArgumentOutOfRangeException(nameof(day));
}
else if (month < 1 && month > 12)
{
throw new ArgumentOutOfRangeException(nameof(month));
}
else if (string.IsNullOrEmpty(username))
{
throw new ArgumentNullException(nameof(username));
}
else if (username is string)
{
throw new ArgumentOutOfRangeException(nameof(username));
}
else
{
return $"{username}-{day}{month}";
}
}
Проблема в return он возвращает мне ArgumentOutOfRangeException, но юнит тест не проходит, я посмотрел сам юнит тест он проверяет переменную username на значения null, пустая строка и строка со значением.
Сначала я написал метод в ArgumentNullException string.IsNullorEmpty; без конструкции else-if ArgumentOutOfRange; тесты частично проходили, а те которые не проходили, параметром возвращали null хотя требовалось ввести строку со значением, я решил добавить блок else-if с ArgumentOutOfRange теперь тест проходил но ссылался на return и выдавал в окне обозревателя сообщение System.ArgumentOutOfRangeException : Specified argument was out of the range of valid values
может я неправильно написал return? Pls Help
Ответы (1 шт):
Зачем вам столько else? И return здесь не при чем. Вы можете вообще все свои проверки убрать, и у вас не выскочит исключения совсем. Проблема именно в проверках day и month.
Проверка типа day < 1 && day > 31 будет всегда false, потому что значение одной и той же переменной не может быть меньше 1 и одновременно больше 31. Логично? Надо ||.
Если аргумент типа string проверить на is string, то будет true если не null, то есть это исключение IndexOutOfRange будет выброшено в любом случае. Я бы убрал эту проверку, потому что предыдущая гарантирует, что дальнейшее выполнение кода будет только в том случае, если строка не пустая. И я бы проверял на null и длину строки отдельно.
public static string GenerateUserCode(int day, int month, string username)
{
if (day < 1 || day > 31)
throw new ArgumentOutOfRangeException(nameof(day));
if (month < 1 || month > 12)
throw new ArgumentOutOfRangeException(nameof(month));
if (username is null)
throw new ArgumentNullException(nameof(username));
if (username.Trim().Length == 0)
throw new ArgumentException("User name was blank", nameof(username));
return $"{username}-{day}{month}";
}