Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 25.03.2015
Сообщений: 7
1

Вынесение проверки try catch в отдельную функцию

07.06.2015, 08:09. Показов 3136. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Смысл в чем, вот есть у меня необходимость ловить много EConvertError при введении параметров из LabeledEdit, если для каждого элемента писать в теле исполняемой функции эту проверку, то это "тело" раздувается раза в три как минимум. Не долго думая написал функцию, но при ее выполнении - ошибка доступа.
C++
1
2
3
4
5
6
7
8
9
10
11
void FloatRights (double number, TLabeledEdit *tested)
{
  try
  {
    number=StrToFloat(tested->Text);
  }
  catch(EConvertError &exception) {
    ShowMessage("Неверно введены данные в поле " + tested->EditLabel->Caption + "!");
    return;
  };
};
Пример использования функции:
C++
1
FloatRights (pids, SinPids);
Я в упор не пойму в чем прикол, гугление не спасло, спросить не у кого. Может проблема в том что эту функцию я вынес в другой файл? Проверил - нет.
В целом интересно можно ли подобную проверку вынести в отдельную функцию что бы оно работало. Прогу пишу в С++ Builder 6. Наверняка на момент первого ответа уже будет поздно, но надеюсь что нет.
На самом деле функция работает каким-то макаром, но вот именно код в блоке try не выполняется хоть ты ему лоб расшиби... но для каждого элемента прописывать проверку отдельно, учитывая их количество и необходимость указывать где именно оператор ввел неправильно параметр, просто невъ***чески тупо... ну не верю что нельзя.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.06.2015, 08:09
Ответы с готовыми решениями:

Вынесение кода в отдельную функцию
Есть дублирующийся участок кода. Преподаватель просит вынести его в отдельную функцию. Помогите...

Вынесение цикла в отдельную функцию и ее вызов
Подскажите, пожалуйста, как правильно вынести цикл в функцию? Вот исходник: #include...

вынесение процедур и функций в отдельную dll С#
Всем привет нужна помощь, есть код калькулятора, надо вынести функции private void...

Описать отдельную функцию проверки, упорядочены ли элементы заданного массива по возрастанию
Помогите пожалуйста. Даны два массива из n целых чисел (n<=10). Для каждого массива проверить,...

12
236 / 196 / 21
Регистрация: 04.06.2014
Сообщений: 1,309
07.06.2015, 09:03 2
Цитата Сообщение от Buyaga Dodzyo Посмотреть сообщение
Я в упор не пойму в чем прикол,
А прикол в том, что try catch, это не функции, а ссылки на обработчик прерывания. Фактически, что происходит. try, в области памяти, резервирует ссылку на функцию обработчика ошибок. В момент возникновения ошибки, управление передаётся на эту ссылку.
Таким образом, try и catch не могут быть самостоятельно включены в проверочную функцию.
Цитата Сообщение от Buyaga Dodzyo Посмотреть сообщение
ну не верю что нельзя.
В том виде, в котором Вы хотите - низя. Но, можно в обработчике catch прописать оператор switch. Тогда все сообщения можно выбирать по коду ошибки.
Да и ещё совет. Научитесь использовать функции препроцессора #ifdef, #ifndef, #defined и #if. Это позволяет выключать отладочные модули, не удаляя их из программы.
1
0 / 0 / 0
Регистрация: 25.03.2015
Сообщений: 7
07.06.2015, 09:46  [ТС] 3
Вот какая крокозябра у меня выходит в одной из функций:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  BSign->Clear();
  Series2->Clear();
  double zatr, ampl, peri, leng;
  int cycl;
  try {zatr=StrToFloat(RectZatr->Text);}
  catch (EConvertError &exception) {ShowMessage("Ошибка1 \"\"!"); return;};
  try {ampl=StrToFloat(RectAmpl->Text);}
  catch (EConvertError &exception) {ShowMessage("Ошибка2 \"\"!"); return;};
  if (zeroif(ampl)) return;
  cycl=StrToInt(RectCycl->Text);
  if (zeroif(cycl)) return;
  if (RadRectPeri->Checked)
    {
    try {peri=StrToFloat(RectPeri->Text);}
    catch (EConvertError &exception) {ShowMessage("Ошибка3\"\"!"); return;};
    }
    else
    {
      try {peri=StrToFloat(RectPeri->Text);}
      catch (EConvertError &exception) {ShowMessage("Ошибка4\"\"!"); return;};
      try {peri=1/peri;}
      catch (EDivByZero &exception) {ShowMessage("Ошибка5"); return;};
    };
  if (peri=0) {ShowMessage("Ошибка!"); return;};
  if (StrToFloat(RectLeng->Text)<peri)
  {
    try {leng=StrToFloat(RectLeng->Text);}
    catch (EConvertError &exception) {ShowMessage("Ошибка6 \"\"!"); return;};
  }
    else
    {
      ShowMessage("Ошибка7 " + FloatToStrF(peri, ffFixed, 20, 2)+ "!");
      return;
    };
  if (zeroif(leng)) return;
  if (OneGraf->Checked)
  {
    RectOneGraf (zatr, ampl, peri, leng, cycl, BSign);
  }
  else
  {
    RectPolGraf (zatr, ampl, peri, leng, cycl, BSign);
  };
}
Я пытался сделать так что бы вот как раз этого, описывать ссылки на обработчик ошибок не надо было так часто, при этом что бы сообщение о ошибке показывало в какой конкретно элемент пользователь ввел параметры в неверном формате. То есть сейчас я самым тупым образом ловлю ошибку на каждом конвертере что бы указать что "Именно тут вот, ты, милый пользователь ввел белиберду! Будь бобр - поправь."... тупым образом. Пытался найти про switch и нашел бы как минимум в справке Builder, но она у меня не работает, знаю что это переключатель работающий в паре с case, но каким боком его с try catch использовать, что-то не пойму, ну фиговый я студент... По коду ошибки то что я пытался сделать не выйдет, если правильно понимаю код ошибки либо динамический и будет каждый раз разное показывать, или будет указывать только на тип ошибки, а не на то в каком элементе она возникла.
С предпроцессорами нас работать вообще не учили еще, да и как это поможет?
Надеюсь хоть суть вопроса стала понятнее.
0
управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
07.06.2015, 09:55 4
А зачем вы каждый раз задаете конструкцию - try/catch ?
Обычно же в try пишется какое-то значение, в catch идет обработка

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
try
  {
    number=StrToFloat(tested->Text);
  }
  catch(EConvertError &exception) {
    ShowMessage("Неверно введены данные в поле " + tested->EditLabel->Caption + "!");
    return;
  };
в этом случае у вас не будет обработки, т.к. в catch вы не передаете значение number
0
0 / 0 / 0
Регистрация: 25.03.2015
Сообщений: 7
07.06.2015, 10:34  [ТС] 5
Задаю каждый раз потому что нужно поймать в каком именно конвертере произошла ошибка, ясен пень что весь код можно было в try загнать и потом просто констатировать что ошибка есть, а вот насчет "в catch вы не передаете значение number" пожалуйста поподробнее. Мне и не надо что бы код исполнялся если ошибка произошла, то есть если сработал catch, или я и тут чего-то не понимаю?
0
управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
07.06.2015, 10:49 6
В try проверяется исключение. В catch обрабатывается это исключение, причем обработок может быть несколько, в зависимости от параметра в catch()
Пример с msdn
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
MyData md;
try {
   // Code that could throw an exception
   md = GetNetworkResource();
}
catch (const networkIOException& e) {
   // Code that executes when an exception of type
   // networkIOException is thrown in the try block
   // ...
   // Log error message in the exception object
   cerr << e.what();
}
catch (const myDataFormatException& e) {
   // Code that handles another exception type
   // ...
   cerr << e.what();
}
 
// The following syntax shows a throw expression
MyData GetNetworkResource()
{
   // ...
   if (IOSuccess == false)
      throw networkIOException("Unable to connect");
   // ...
   if (readError)
      throw myDataFormatException("Format error"); 
   // ...
}
0
0 / 0 / 0
Регистрация: 25.03.2015
Сообщений: 7
07.06.2015, 11:06  [ТС] 7
Это я знаю, или Вы хотите сказать что можно прописать catch так что бы там именно выполнялся нужный код если ошибки не произошло?
Впрочем есть предположение что нужно было просто тупо return убрать что бы все заработало, но это только предположение с которым за неимением времени повожусь чуть позже... и которое наверняка неверное.
Ошибки моя функция ловила на ура и выводила даже правильно поле в котором ошибка, вся проблема именно в невыполнении кода в контейнере try.
0
управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
07.06.2015, 11:25 8
Т.е. как я понял, вам нужно проверять поля на наличие алфавитных символов? Т.е. не при вводе в Edit, а уже после того как заполнены некоторые поля ?
Почему не воспользоваться масской ввода ?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.06.2015, 11:46 9
Лучший ответ Сообщение было отмечено Buyaga Dodzyo как решение

Решение

От исключений к кодам возврата?
C++
1
2
3
4
5
if(!TryStrToFloat(tested->Text,number))
{
    ShowMessage("Неверно введены данные в поле " + tested->EditLabel->Caption + "!");
    return;
}

Цитата Сообщение от Buyaga Dodzyo Посмотреть сообщение
Задаю каждый раз потому что нужно поймать в каком именно конвертере произошла ошибка,
А вообще ничто не мешает создать свой класс исключений содержащий например id места ошибки.

Добавлено через 5 минут
Edit и отрицательные числа
1
0 / 0 / 0
Регистрация: 25.03.2015
Сообщений: 7
07.06.2015, 12:00  [ТС] 10
Может потому что я с таким еще не сталкивался, вообще я заблочил ввод любых символов кроме цифр и запятой, там где целочисленные вводные - проблем нет, а вот запятую можно и 2 раза ввести что и приведет к ошибке конвертирования. Ошибка вылазит при конвертировании, а не вводе, вот где собака покопалась.
Avazart спасибо, над первым поработаю так как понятнее, а вот со вторым буду бодаться еще больше... вот если бы еще предыдущий вариант вернул, там где было через функцию, не успел запомнить. Уже хотя бы не мрак...
0
управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
07.06.2015, 12:03 11
А маску почему не хотите использовать ?
0
0 / 0 / 0
Регистрация: 25.03.2015
Сообщений: 7
07.06.2015, 14:25  [ТС] 12
Я с масками ввода еще не работал, а разбираться времени нет, оно может и проще было, но время у меня на дописание проги времени до 0:00, так что...

Добавлено через 1 час 55 минут
Avazart, попытался втулить данный Вами код в функцию, как только до нее доходит так сразу пишет переполнение операции с плавающей точкой (floating point overflow)... Бред какой-то, но как есть.
0
Avazart
07.06.2015, 15:32     Вынесение проверки try catch в отдельную функцию
  #13

Не по теме:

Кто вам винова коли руки кривы, и вы даже код втавить не можете, и вообще какого код в две строчки пихать в функцию.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.06.2015, 15:32

Вынесение кода в функцию не работает
Почему не хочет работать? &lt;?php function fun() {...

Как выдернуть функцию локализации приложения в отдельную функцию из имеющегося проекта
Ребята, помогите, уже глаза болят. У меня имеется проект неизвестного мне автора, в котором он...

Try catch реализация для проверки вводимых типов данных в объект
Доброго времени суток, форум! Прошу помощи в реализации проверки потока ввода в класс на...

Что использовать для проверки корректности введенного значения - If или try catch?
Проверку на правильность введенного значения лучше делать с помощью условного оператора или блоком...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru