Попробуйте программу Catch Exception - PullRequest
0 голосов
/ 04 мая 2020

Здравствуйте, я столкнулся с проблемой в моей программе C#. Вопрос:

"Напишите метод ReadNumber(int start, int end), который считывает целое число из консоли в диапазоне [start...end]. В случае, если введенное целое число недействительно или находится за пределами требуемого диапазона сгенерировать соответствующее исключение.

Используя этот метод, напишите программу, которая принимает 10 целые числа a1, a2, ..., a10 такие, что 1 < a1 < ... < a10 < 100.

Код, который у меня есть:

public class NumberRange
{
    public void ReadNumber(int start, int end)
    {
        try
        {
            int [] arr = new int [10];
            int j = 1;

            for(int i = 0; i < 10; i++, j++)
            {
                Console.Write("Enter Integer No " + j + ":- ");
                arr[i] = Int32.Parse(Console.ReadLine());
            }

            Console.WriteLine("Array Values Are:- ");

            for(int k = 0;k < 10; k++)
            {
                Console.WriteLine(arr[k]);

                if (start < arr[k] && arr[k] < end)
                {
                    Console.WriteLine("These Values Are In The Range!");
                }
            }
        }
        catch(ArgumentOutOfRangeException)
        {
            throw new ArgumentOutOfRangeException(
                "These Values Are Not Valid Or In The Range Between 1-100!");
        }
}

class Program
{
    static void Main(string[] args)
    {
        NumberRange range = new NumberRange();
        range.ReadNumber(1,100);
        Console.ReadKey();
    }
}

Когда я запускаю эту программу, она не улавливает исключение ArgumentOutOfRangeException.

Я пробовал много раз, но программа не дает правильного вывода чего я жду.

Ответы [ 3 ]

1 голос
/ 05 мая 2020

Перехват одного исключения и последующее генерирование аналогичного исключения кажется coutner интуитивно понятным и только затрудняет чтение кода.

Это правда, что самый быстрый способ проверить int - это попытаться разобрать, но вы не хочу иметь дело со всеми этими беспорядочными исключениями, которые он выбрасывает. Почему бы не использовать TryParse ()?

string input; //set outside of this codes scope

bool isInteger;
int output;

isInteger = Int.TryPrase(input, out output);

if(isInteger){
  //Do stuff with the integer
  //Like range checks, adding to collection, etc.
}
else{
  //Throw an exception
}

Там нет try / case внутри ReadNumber, который нужно писать. Весь пример Try / находится внутри TryParse или снаружи ReadNumber.

Возможно, они не хотели, чтобы вы использовали этот способ для проверки int (вместо этого вы сами написали код basi c). Но в этом случае этот код легко адаптируется.

Сноски

Если вам интересно, как правильно обрабатывать исключения Parse, я однажды написал базовый c Имитация TryParse ():

//Parse throws ArgumentNull, Format and Overflow Exceptions.
//And they only have Exception as base class in common, but identical handling code (output = 0 and return false).

bool TryParse(string input, out int output){
  try{
    output = int.Parse(input);
  }
  catch (Exception ex){
    if(ex is ArgumentNullException ||
      ex is FormatException ||
      ex is OverflowException){
      //these are the exceptions I am looking for. I will do my thing.
      output = 0;
      return false;
    }
    else{
      //Not the exceptions I expect. Best to just let them go on their way.
      throw;
    }
  }

  //I am pretty sure the Exception replaces the return value in exception case. 
  //So this one will only be returned without any Exceptions, expected or unexpected
  return true;
}
1 голос
/ 05 мая 2020

Почему вы ловите ArgumentOutOfRangeException? Если мы посмотрим на документацию , мы увидим, что он выдает FormatException, если введенное число не является допустимым числом.

Также обратите внимание, что есть два условия, при которых мы генерируем исключения:

  1. Введено недопустимое целое число
  2. Целое число находится за пределами указанного диапазона

Таким образом, мы можем поймать это FormatException и затем выбросить наш собственное исключение с настраиваемым сообщением. А затем нам просто нужно проверить, что преобразованное значение находится в указанном диапазоне, и если это не так, мы генерируем другое исключение с настраиваемым сообщением:

public static int ReadNumber(int start, int end)
{
    // Make sure they entered a valid range, otherwise our comparison logic will fail later
    if (end < start) 
    {
        throw new ArgumentOutOfRangeException("'end' cannot be less than 'start'");
    }

    // Get user input and create a variable to store the converted value
    var input = Console.ReadLine();
    int result;

    // Try to parse the input into our result
    try
    {
        result = int.Parse(input);
    }
    catch(FormatException)
    {
        // If we get here, it means the input was not a valid number
        throw new ArgumentException($"{input} is not a valid integer.");
    }

    // Last thing to do is make sure the number is within range
    if (result < start)
    {
        throw new ArgumentOutOfRangeException($"Input cannot be less than {start}.");
    }
    else if (result > end)
    {
        throw new ArgumentOutOfRangeException($"Input cannot be greater than {end}.");
    }

    return result;
}
1 голос
/ 04 мая 2020

Значит, вам нужно сгенерировать исключение, когда это необходимо:

if (start < arr[k] && arr[k] < end)
{
    Console.WriteLine("These Values Are In The Range!");
}
else
{
    throw new ArgumentOutOfRangeException("These Values Are Not Valid Or In The Range Between 1-100!");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...