Как я могу поймать исключение в c#? - PullRequest
0 голосов
/ 15 апреля 2020

У меня проблемы с отловом исключения в c#. Я хочу преобразовать числа из десятичных систем в (другие) системы, например, если пользователь вводит de c num, который содержит другие символы ('a', 'b', 'c' et c .) Программа покажет сообщение об ошибке.

try
{
    string numbers = "0123456789abcdef";
    for (int i=0; i<txt.Length; i++)
    {
        for (int j=0; j<16; i++)
        {
            if (txt[i] == numbers[j] && j >= 10)
                throw new Exception();
        }
    }
}
catch (Exception)
{
    MessageBox.Show("Error!");
}

Спасибо!

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Исключения предназначены для исключительных ситуаций ; здесь у вас есть пользовательский ввод проверка (нет необходимости в таких средствах, как исключения); будет достаточно простого l oop (foreach) и if:

 foreach (char c in txt)
   if (c < '0' || c > '9') {
     MessageBox.Show("Error!");

     break; // at least one error, let's skip further validation 
   }
0 голосов
/ 15 апреля 2020

Есть две статьи по обработке исключений, на которые я часто ссылаюсь:

Вы находитесь в неопровержимой позиции написания собственного кода разбора и создания исключений. Но это может на самом деле быть ненужным - NET имеет поддержку для бесчисленных числовых форматов и систем нумерации. От шестнадцатеричного до десятичного можно сделать 2 команды: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/how-to-convert-between-hexadecimal-strings-and-numeric-types#example -2

Похоже, вы пытаетесь заново изобрести Int.TryPrase () и делаете почти все неправильно. Вы должны попытаться использовать существующие функции разбора, прежде чем пытаться заново изобрести колесо.

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

Если вы не решаетесь изобретать это колесо, я бы посоветовал в первую очередь прочитать две статьи, которые я связал, так что вы делаете не делать общих ошибок обработки исключений. Однажды я написал приближение TryParse для кого-то, кто застрял на Framework 1.1. Это может дать вам несколько идей:

//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;
}
...