Перехват одного исключения и последующее генерирование аналогичного исключения кажется 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;
}