2 / 2 / 3
Регистрация: 30.06.2015
Сообщений: 177
1

Подскажите как правильно написать программу чтобы она продолжала работать, даже если ничего не нашла?

06.08.2018, 09:49. Показов 1359. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Имею следующую проблему. Пишу парсер для Ворд, выбирающий значения и вставляющий в эксель. Но есть одни нюанс. Если искомое слову не удается найти то программа вылетает с ошибкой, если вписать цикл в try, то программа не вылетает а просто перестает работать. Подскажите как правильно написать программу чтобы программа пролдолжала работать, даже если ничего не нашла. Код прилагаю.

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
47
48
49
50
51
52
53
private void button3_Click(object sender, EventArgs e)
        {
 
 
 
                Word.Application word = new Word.Application();
                Excel.Application excel = new Excel.Application();            
                Excel.Workbook wb1;
                Excel.Worksheet wksheet;
                
                wb1 = excel.Workbooks.Add(System.Reflection.Missing.Value);
                wksheet = (Excel.Worksheet)wb1.Sheets[1];
 
                int i = 0;
                try
                {
                    foreach (var item in checkedListBox1.CheckedItems)
                    {
 
 
                        var text = word.Documents.Open(item.ToString());
                        string allText = text.Content.Text;
 
 
 
                        int istart = allText.IndexOf("Дата сделки:") + "Дата сделки:".Length;
                        string a = allText.Substring(istart, allText.IndexOf("Дата начала срока:") - istart);
                        MessageBox.Show(a);
 
                        int istart2 = allText.IndexOf("Покупатель:") + "Покупатель:".Length;
                        string b = allText.Substring(istart2, allText.IndexOf("Продавец:") - istart2);
                        MessageBox.Show(b);
 
                        int istart3 = allText.IndexOf("Валюта платежа") + "Валюта платежа".Length;
                        string c = allText.Substring(istart3, allText.IndexOf("Дата уплаты премии:") - istart3);
                        MessageBox.Show(c);
 
                        excel.Visible = true;
                        i++;
                        wksheet.Cells[i, 1] = a;
                        wksheet.Cells[i, 2] = b;
                        wksheet.Cells[i, 6] = c;
                    }
                }
                catch (Exception ex)
                {
 
                }
                finally 
                
                {
                
                }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.08.2018, 09:49
Ответы с готовыми решениями:

Как сделать так, чтобы при выходе из программы она продолжала работать? (не вирус)
Пишу программу под Андроид. как сделать так, чтобы при выходе из программы она продолжала...

Как отключить отображение программы в трее, чтобы при этом она продолжала работать в фоне?
Всем привет. Есть программа, которая умеет сворачиваться в трей. Нужно отключить отображение этой...

Как сделать, чтобы немодальная форма всегда была поверх других (даже если она не активна)?
Субж... Недавно перешел с Дельфей на VB (вынужден был по работе)... Этот вопрос - мое первое...

Как записать программу на HDD, чтобы она осталась и работала даже после форматирования
Привет. Как записать программу на HDD, чтобы она осталась и работала даже после форматирования?...

7
910 / 795 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
06.08.2018, 10:01 2
Вы при ошибке прерываете Ваш цикл полностью, т.к Вам это не нужно, то логичнее будет try catch поместить внутри цикла. Тогда при ошибке на 1 из значений в checkedListBox просто пойдёт следующее, однако не стоит делать "глухой" catch, пишите хотя бы для себя что за ошибка у Вас произошла.
1
716 / 473 / 258
Регистрация: 19.12.2014
Сообщений: 1,801
06.08.2018, 10:10 3
Ошибку можно тут привести? Так то у вас потенциально 3 ошибки в строках типа этой:
C#
1
a = allText.Substring(istart, allText.IndexOf("Дата начала срока:") - istart);
Если не будет найдена строка "Дата начала срока:" получите System.ArgumentOutOfRangeException

Добавлено через 4 минуты
и конец лучше такой сделать что бы программы Word и Excel не оставались в памяти висеть после падения приложения:
C#
1
2
3
4
5
6
7
8
9
                {...}catch(Exception e)
                {
                    MessageBox.Show(e.Message);
                }
                finally
                {
                    word.Quit();
                    excel.Quit();
                }
1
2 / 2 / 3
Регистрация: 30.06.2015
Сообщений: 177
06.08.2018, 10:23  [ТС] 4
Благодарю. Такой вариант сработал, но теперь возникает вопрос что делать если ошибка только в одном из искомых значении? Объект в чекбоксе пропускается и полностью не проверяется при первой же ошибке. Предполагаю что искомые объекты тоже нужно отдельно поместить в try?

Добавлено через 5 минут
HectorPrima, Обычно если не находит то ругается что: Длинна не может быть меньше нуля.
0
716 / 473 / 258
Регистрация: 19.12.2014
Сообщений: 1,801
06.08.2018, 10:39 5
Лучший ответ Сообщение было отмечено GrimShadow как решение

Решение

C#
1
2
3
4
5
6
                    a = getString(ref allText, "Дата сделки:", "Дата начала срока:");
                    MessageBox.Show(a);
                    b = getString(ref allText, "Продавец:", "Покупатель:");
                    MessageBox.Show(b);
                    c = getString(ref allText, "Валюта платежа", "Дата уплаты премии:");
                    MessageBox.Show(c);
C#
1
2
3
4
5
6
7
8
9
10
public string getString(ref string allText, string FromStr, string ToStr)
        {
            var from_position = allText.IndexOf(FromStr) + FromStr.Length; 
            var to_position = allText.IndexOf(ToStr);
            if (to_position > 0 && from_position > 0 && to_position > from_position)
            {
                return allText.Substring(from_position, to_position - from_position);
            }
            return "";
        }
1
2 / 2 / 3
Регистрация: 30.06.2015
Сообщений: 177
06.08.2018, 11:54  [ТС] 6
HectorPrima, Что то я теперь совсем запутался.... не понимаю зачем объявленные переменные a,b,c и зачем их выводить в меседжбоксе, если в public string getString будут помещены ранее объявленные в них значения? Как из него вывести полученные данные в эксель?
0
716 / 473 / 258
Регистрация: 19.12.2014
Сообщений: 1,801
06.08.2018, 13:48 7
Лучший ответ Сообщение было отмечено GrimShadow как решение

Решение

Ну что непонятного то. getString ищет в тексте две строки. Возвращает то что между ними. Так же как у вас и было.
И в меседжбоксе вы сами выводили выше в коде. Я просто повторил!
Просто вместо
C#
1
2
3
int istart = allText.IndexOf("Дата сделки:") + "Дата сделки:".Length;
string a = allText.Substring(istart, allText.IndexOf("Дата начала срока:") - istart);
MessageBox.Show(a);
Можно написать
C#
1
2
a = getString(ref allText, "Дата сделки:", "Дата начала срока:");
MessageBox.Show(a);
Ну и вставить куда нибудь в класс метод getString
1
2 / 2 / 3
Регистрация: 30.06.2015
Сообщений: 177
07.08.2018, 04:29  [ТС] 8
HectorPrima, Благодарю за ответ. Я меседж боксы использую для себя чтоб видеть что поместилось в переменную, поэтому не понял вашу мысль)
0
07.08.2018, 04:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.08.2018, 04:29
Помогаю со студенческими работами здесь

Как мне обработать исключение так, чтобы программа продолжала работать, будто исключения не было?
Друзья! Есть текстовый файл в кодировке UTF-16LE (суть тот же самый файл *.reg, только сохранённый...

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

как сделать чтобы в процессе программа ждала завершения работы скажем батника а потом продолжала работать
как сделать чтобы в процессе программа ждала завершения работы скажем батника а потом продолжала...

Как правильно распараллелить программу чтобы она не тормозила
С потоками никогда особо не работал, просто не было каких то тяжеловесных задач. Сейчас такая...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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