Я полагаю, что использование обработки исключений попытки/выгоды хуже, чем использование простых кодов возврата и связало общие структуры обмена сообщениями для переправления полезных сообщений об ошибках.
Сорящий код с блоками попытки/выгоды не является решением.
Просто передающие исключения стек, надеющийся, что выше Вас, сделает правильную вещь или генерирует информативную ошибку, не решение.
Взгляды у Вас есть любой шанс систематической проверки, что надлежащие обработчики исключений доступны для обращения к чему-либо, что могло пойти не так, как надо или в прозрачных или в непрозрачных объектах, не реалистично. (Думайте также с точки зрения последней привязки / внешних библиотек и ненужных зависимостей между несвязанными функциями в стеке вызовов, поскольку система развивается)
, Использование кодов возврата просто, может легко систематически проверяться для покрытия, и, если обработано правильно вынуждает разработчиков генерировать полезные сообщения об ошибках, а не слишком общие дампы стека и затенить исключения ввода-вывода, которые "исключительно" бессмысленны даже к большей части clueful конечных пользователей.
-
Мое заключительное возражение является использованием собравших "мусор" языков. Не понимайте меня превратно.. Я люблю их при некоторых обстоятельствах, но в целом для систем сервера/MC у них нет места, по моему мнению.
GC весьма ненадежен - даже чрезвычайно, хорошо разработал алгоритмы GC, может держаться за объекты слишком долго или даже навсегда на основе неочевидных круговых ссылок в их графиках зависимости.
системы неGC после нескольких простых шаблонов и использования памяти бухгалтерские инструменты не имеют этой проблемы, но действительно требуют большего количества работы в дизайне и тестируют заранее, чем среды GC. Компромисс здесь - то, что утечки памяти чрезвычайно легко определить во время тестирования в неGC при нахождении, что связанные с GC проблемные условия являются намного более трудным суждением.
Память является дешевой, но что происходит, когда Вы просачиваетесь, дорогие объекты, такие как транзакция обрабатывает, объекты синхронизации, сокетные соединения... и т.д. В моей среде, самая мысль, что можно просто расслабиться и позволить языку волноваться об этом для Вас, невероятна без значительных изменений fundental в описании программного обеспечения.
Вместо использования Convert.ToInt32 (string)
вам следует рассмотреть возможность использования Int32.TryParse (string, out int)
. Методы TryParse помогают более безопасно обрабатывать вводимые пользователем данные. Наиболее вероятная причина вашей ошибки заключается в том, что возвращаемая вами подстрока имеет недопустимое строковое представление целочисленного значения.
string str = line.Substring(0,1);
int i = -1;
if (Int32.TryParse(str, out i))
{
Console.WriteLine(i);
}
Значение FormatException
не состоит из необязательного знак, за которым следует последовательность цифр (От 0 до 9).
Исключение, которое выдается, когда формат аргумента не соответствует спецификации параметров вызванный метод.
Вы можете использовать Int32.TryParse , если вы не хотите генерировать подобное исключение.
Int32.TryParse : преобразует строковое представление число в 32-битное целое число со знаком эквивалент. Возвращаемое значение указывает успешна ли операция.
Вполне возможно, что там есть пробелы. Попробуйте запустить что-нибудь похожее на trim () (я не уверен, на каком вы языке), которое удалит пустое пространство. Кроме того, попробуйте распечатать строку, чтобы убедиться, что у вас действительно правильная ее часть. Мы все это сделали :)
Вполне вероятно, что введенный вами формат не допустимый формат. Попробуйте вместо этого. Если число недействительно, должно появиться сообщение об ошибке.
Имейте в виду, что строка должна состоять из необязательного знака, за которым следует число.
string line = "23"; // or whatever.
string str = line.Substring(0,1);
int i = 0;
if (Int32.TryParse(str, out i)) {
Console.WriteLine(i);
} else {
Console.WriteLine ("Error converting '" + line + "', '" + str + "'.");
}
Вы можете увидеть, что пользователь вводит " -1 "
например. Если вы введете подстроку (0,1)
на этом, вы получите только "-"
, что на самом деле неверно.
Вы уверены, что значение, возвращаемое в str, является целым, установите точку отладки, если вы используете Visual Studio. У меня есть ощущение, что ваша проблема может быть в том, что вы на самом деле не возвращаете целое число. Попробуйте:
line.Trim().Substring(0,1);
Это удалит все пробелы.