Проверка введенного значения и выдача exception'a
Вобщем, есть задачка:
[COLOR="DarkRed"]Ввести с клавиатуры число в диапазоне от 100 до 100000000 и проверь введенное число, при необходимости выдать сообщение об исключении.[/COLOR]
Язык C#.
Реализовал я ее следующим способом, но там не все гладко :(
[COLOR="#0000ff"]namespace[/COLOR] Chitaem_chislo
{
[COLOR="#0000ff"]class[/COLOR] [COLOR="Teal"]ReadChislo[/COLOR]
{
[COLOR="#0000ff"]static void[/COLOR] Main()
{
[COLOR="Blue"]ulong[/COLOR] Chislo = 0;
[COLOR="#0000ff"]while[/COLOR] (Chislo == 0)
{
[COLOR="#008080"]Console[/COLOR].Write("[COLOR="DarkRed"]Введите число:[/COLOR]");
[COLOR="#008080"]Console[/COLOR].WriteLine("[COLOR="#8b0000"](от {0} до {1}):[/COLOR]", 100, 100000000);
[COLOR="#0000ff"]try[/COLOR]
{
Chislo = [COLOR="#008080"]Convert[/COLOR].ToUInt32([COLOR="#008080"]Console[/COLOR].ReadLine());
}
[COLOR="#0000ff"]catch[/COLOR] ([COLOR="#008080"]Exception[/COLOR] ex)
{
[COLOR="#008080"]Console[/COLOR].WriteLine(ex.Message + " [COLOR="#8b0000"]Попробуйте снова!!!\n[/COLOR]");
}
}
[COLOR="#008080"]Console[/COLOR].WriteLine("[COLOR="#8b0000"]\n\nPress Enter, please...[/COLOR]");
[COLOR="#008080"]Console[/COLOR].Read();
}
}
}
Я никак не могу сделать проверку входит ли введеное число в range, и соответственно выдавать exception.
Я так понимаю, здесь необходимо создать метод, который будет проверять это число, верно ли это?
Подскажите, пожалуйста, в каком направлении копать.
Заранее благодарен.
{
Chislo = [COLOR=#008080]Convert[/COLOR].ToUInt32([COLOR=#008080]Console[/COLOR].ReadLine());
if (Chislo < 100 || Chislo > 100000000)
// сообщение об ошибке :)
}
[COLOR=#0000ff]catch[/COLOR] ([COLOR=#008080]Exception[/COLOR] ex)
{
[COLOR=#008080]Console[/COLOR].WriteLine(ex.Message + " [COLOR=#8b0000]Попробуйте снова!!!\n[/COLOR]");
}
так? )
if (Chislo < 100 || Chislo > 100000000)
// сообщение об ошибке :)
Да, это практически то что нужно, но этот вариант я уже опробывал.
Я извиняюсь, я немного не корректно поставил вопрос. Мне нужно, чтобы после проверки введенного числа, и если оно не подходит под range, выдавался exception и снова предложение ввести число, т.е. цикл while продолжается. А в данной ситуации, цикл while прекращается, как я понимаю, и происходит выход из программы.
Я в принципе все реализовал, но с применением goto и метки, но как говорится это "признаки дурного тона".
{
do
{
try
{
bool Danger = false;
Success = true;
MakeJob();
Danger = CheckDanger();
if (Danger) throw (new MyException());
MakeLastJob();
}
catch (MyException me)
{
if(count > maxcount) throw(new MyException("Три попытки были безуспешны"));
Success = false;
count++;
//корректировка ситуации
Console.WriteLine("Попытка исправить ситуацию!");
level +=1;
}
}while (!Success);
}
namespace Chitaem_chislo
{
class ReadChislo
{
static void Main()
{
ulong Chislo = 0;
while (Chislo == 0)
{
Console.Write("Введите число:");
Console.WriteLine("(от {0} до {1}):", 100, 100000000);
try
{
Chislo = Convert.ToUInt32(Console.ReadLine());
[COLOR="#ff0000"]if (Chislo < 100 || Chislo > 100000000) throw new //SomeException;[/COLOR]
}
catch (Exception ex)
{
Console.WriteLine(ex.Message + " Попробуйте снова!!!\n");
[COLOR="Red"]Chislo = 0;[/COLOR]
}
}
Console.WriteLine("\n\nPress Enter, please...");
Console.Read();
}
}
}
class Program {
static long ParseInputValue(string str) {
long result = long.Parse(str);
if(result < 100L)
throw new FormatException("Число меньше 100.");
if(result > 100000000L)
throw new FormatException("Число больше 100000000");
return result;
}
static void Main() {
long value = 0;
while (true) {
Console.Write("Введите число:");
Console.WriteLine("(от {0} до {1}):", 100, 100000000);
try {
value = ParseInputValue(Console.ReadLine());
Console.WriteLine("Все ОК :)");
} catch (FormatException ex) {
Console.WriteLine(ex.Message + " Попробуйте снова!!!\n");
}
}
}
}
Console.Write("Введите число:");
Console.WriteLine("(от {0} до {1}):", 100, 100000000);
try {
value = ParseInputValue(Console.ReadLine());
Console.WriteLine("Все ОК :)");
} catch (FormatException ex) {
Console.WriteLine(ex.Message + " Попробуйте снова!!!\n");
}
}
Нет, проверка ввода с выбросом исключения. long.Parse выбрасывает FormatException (ну и AgrumentNullException, если строка - null), его можно в принципе и для наших целей использовать.
А при правильном вводе исключения не будет :) И мегасофтна напечатает
[quote=Мегасофтина]
Все ОК :)
[/quote]
А от ArgumentNullException можно защититься вот так:
long result = long.Parse(str ?? string.Empty);
if(result < 100L)
throw new FormatException("Число меньше 100.");
if(result > 100000000L)
throw new FormatException("Число больше 100000000");
return result;
}
Из while(true) без бросания exception мегасофтина выходит как-то?
ЗЫ: С до-диез знаком не близко :)
Ctrl+C / Ctrl+Break / Alt + F4 зачем накручивать полную инфраструктуру работы в консольной одноразовой программе?
Философия, однако!
hardcase проще нельзя, просто-напросто по той причине, что я многого еще не знаю, да и впридачу нужно использовать только тот материал который прошел. Поэтому, в связи с тем, что с [COLOR="Blue"]Parse'ом[/COLOR] я еще не работал, приходится обходится другими реализациями.
Ctrl+C / Ctrl+Break / Alt + F4 зачем накручивать полную инфраструктуру работы в консольной одноразовой программе?
Да, я понимаю, что здесь накручивать нету смысла, но просто это часть программки, и дальше она еще будет дописываться, поэтому постоянный цикл мне здесь не нужен.
В общем, остановился на этом:
namespace Chitaem_chislo
{
class ReadChislo
{
static void Main()
{
long Chislo = 0;
while (Chislo == 0)
{
Console.Write("Введите число: ");
Console.WriteLine("(от {0} до {1}):", 100, 100000000);
try
{
Chislo = Convert.ToInt32(Console.ReadLine());
if (Chislo < 100 || Chislo > 100000000)
throw new FormatException("Число не подходит!");
}
catch (FormatException ex)
{
Console.WriteLine(ex.Message + " Попробуйте снова!\n");
Chislo = 0;
}
}
Console.WriteLine("Вы ввели число: {0}", Chislo);
Console.WriteLine("\n\nНажмите Enter для выхода...");
Console.Read();
}
}
}