Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Kuzya69
38 / 1 / 1
Регистрация: 24.11.2012
Сообщений: 191
#1

Можно ли написать обработчик с двумя видами исключений?

30.04.2017, 19:09. Просмотров 145. Ответов 5
Метки нет (Все метки)

Сразу прошу прощения за "безграмотность". Попробую объяснить суть проблемы, доступными мне словами.
Работаю с ЮСБ-устройством. Мне необходимо в любом коде программы (в функциях и процедурах) учитывать возможные сбои связи, непредвиденные ситуации в расчетах, неадекватное поведение юсб-устройства... Поэтому я весь код функции или процедуры помещаю в блоки "try - except - end".
Внутри обработчика исключения, я использую две конструкции "on E: ИмяИсключения do ...;". Потому что обработчики отличаются в зависимости от места создания соответствующего исключения (в частности это сильно зависит, от того, подключен-ли я в данный момент к устройству, или отключен и обрабатываю данные).
Я по возможности сократил, весь код.
Основной код:
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
unit Main;
inteface
uses Windows, Classes, Forms, ....
type
  EmyExc1 = class(Exception);
  EmyExc2 = class(Exception);
  EmyExc3 = class(Exception);
  EmyExc4 = class(Exception);
  EmyExc5 = class(Exception);
  EmyExc6 = class(Exception);
procedure TMainForm.Button1Click(Sender:TObject);
begin
  try
    ...............
    if (...) then raise EmyExc1.Create('...');
    ...............
    if (...) then raise EmyExc2.Create('...');
    ...............
 except
    on E: EmyExc1 do procedure Obrab1(...);
    on E: EmyExc2 do procedure Obrab2(...);
    else ObrabCom(...);
  end;
end;

Но и сами обработчики исключений построены примерно по такому-же принципу:
Кликните здесь для просмотра всего текста
Delphi
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
procedure Obrab1(...);
begin
  try
    ...............
    if (...) then raise EmyExc3.Create('...');
    ...............
    if (...) then raise EmyExc4.Create('...');
    ...............
  except
    on E: EmyExc3 do procedure Obrab3(...);
    on E: EmyExc4 do procedure Obrab4(...);
    else ObrabCom(...);
  end;
end;
procedure Obrab2(...);
begin
  try
    ...............
    if (...) then raise EmyExc5.Create('...');
    ...............
    if (...) then raise EmyExc5.Create('...');
    ...............
  except
    on E: EmyExc5 do procedure Obrab5(...);
    on E: EmyExc6 do procedure Obrab6(...);
    else ObrabCom(...);
  end;
end;

Суть вопроса не в этом. Код рабочий, и вроде не сбойный, по крайней мере протестировал я его в самых тяжелых условиях, специально шнур выдергивал, процессор в девайсе перезагружал в момент связи. Хватит прелюдии, вопрос вот в чем.
У меня заголовок задания своих глобальных исключений вырос уже до "EmyExc16".
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
type
  EmyExc1 = class(Exception);
  EmyExc2 = class(Exception);
  EmyExc3 = class(Exception);
  EmyExc4 = class(Exception);
  EmyExc5 = class(Exception);
  EmyExc6 = class(Exception);
  .....................................

Но по сути внутри каждой процедуры или функции, я использую два или три исключения. Можно-ли задание этих исключений делать непосредственно внутри самой процедуры или функции, то-есть сделать их локальными? Что-бы не раздувать глобальный список, и не пытаться потом выяснить, какое исключение используется в какой процедуре-функции.
Еще раз прошу прощение, за сумбурную терминологию, плохо владею правильными названиями.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.04.2017, 19:09
Ответы с готовыми решениями:

Написать программу вычисления с отловом исключений
пожалуйста, помогите написать в делфи программу вычисления, в которой:...

Как написать обработчик исключений в Lazarus pascal?
var Form1: TForm1; A:array of integer; b: integer; result:...

Обработка исключений. Как организовать общий обработчик исключений?
У меня есть последовательность вызова методов для внесения данных в таблицу БД....

HDD с двумя видами разъемов питания
Доброго времени суток. Попал в руки жд с sata и molex разъемами питания. И вот...

Отсортировать массив двумя видами сортировок
Генерируется массив, сортируется двумя видами сортировок. Но при запуске...

5
cotseec
Пишу на Delphi...иногда
1407 / 1267 / 284
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
Завершенные тесты: 3
30.04.2017, 19:17 #2
Анонимные методы вместо Obrab1..ObrabN
поддерживают старшие версии Delphi
0
Kuzya69
38 / 1 / 1
Регистрация: 24.11.2012
Сообщений: 191
30.04.2017, 19:31  [ТС] #3
Так мне не количество Obrab1..ObrabN, надо сократить, а количество EmyExc1..EmyExcN.
Или на этой основе, можно и имя обработчика передать в исключение?
Что-то типа:
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure TMainForm.Button1Click(Sender:TObject);
begin
  try
    ...............
    if (...) then raise Exception.Create(Obrab1);
    ...............
    if (...) then raise Exception.Create(Obrab2);
    ...............
 except
   ........ А вот тут пока не знаю как написать .....
  end;
end;

И потянет-ли эти "Анонимные Методы" моя Д2007?
0
cotseec
Пишу на Delphi...иногда
1407 / 1267 / 284
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
Завершенные тесты: 3
30.04.2017, 20:24 #4
исходя из того, что видно в коде:
при каком-то условии генерируется ошибка, которая обрабатывается тут же, не в вызвавшем методе, не в глобальном обработчике ошибок, а тут же
так зачем их вообще плодить, если можно написать
если что-то случилось, то генерируем ошибку вызываем обработку и выходим из метода
имхо, если ошибки обрабатываются на уровне всего приложения, то тогда имеет смысл генерировать свой объект для каждой ошибки, а как написано у вас - лишнее
как размышление, объект порожденный от Exception не наследует какие-либо дополнительные поля вроде идентификатора простого типа или таковых нет?

З.Ы. D2007, на сколько я знаю, не понимает анонимные методы
0
Kuzya69
38 / 1 / 1
Регистрация: 24.11.2012
Сообщений: 191
01.05.2017, 01:49  [ТС] #5
Цитата Сообщение от cotseec Посмотреть сообщение
так зачем их вообще плодить, если можно написать
если что-то случилось, то генерируем ошибку вызываем обработку и выходим из метода
имхо, если ошибки обрабатываются на уровне всего приложения, то тогда имеет смысл генерировать свой объект для каждой ошибки, а как написано у вас - лишнее
Ну, честно говоря, специально это не планировалось. Раньше все было просто.
Кликните здесь для просмотра всего текста
Delphi
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
unit Main;
inteface
uses Windows, Classes, Forms, ....
type
  EmyExc1 = class(Exception);
  EmyExc2 = class(Exception);
procedure TMainForm.Button1Click(Sender:TObject);
begin
  try
    ...............
    if (...) then raise EmyExc1.Create('Open Port');
    ...............
    if (...) then raise EmyExc2.Create('Transmit');
    ...............
    if (...) then raise EmyExc2.Create('Reseve');
    ...............
 except
    on E: EmyExc1 do
    begin 
      ShowMessage('Error ProgramDevice('  + E.Message + ')'););
      exit;
    end;
    on E: EmyExc2 do 
    begin
      ShowMessage('Error ProgramDevice('  + E.Message + ')');
      CloseDevice;
      exit;
    end;
    else begin
      ShowMessage('Error Unknown');
      exit;
    end;
  end;
   ....................
end;

Надоели частые вылеты по поводу и без повода, тем более, что после некоторых вылетов, после перенастройки соединения, можно было продолжать выполнение кода, расположенного после защищенного участка.
Ну вот постепенно, этот код и стал обрастать дополнительными исключениями. Я же говорю, вроде теперь работает нормально. Поэтому, не охота перелопачивать весь код. Вся загвоздка заключается в том, что когда подправляешь, давно написанную подпрограмму или функцию, то часто путаешься, какое исключение надо вызывать. Поэтому и спрашивал, нельзя-ли не создавать, такую кучу глобальных классов "EmyExcN = class(Exception);", а создавать в каждой подпрограмме, функции один-два локальных класса исключений, которые будут работать только в пределах данной подпрограммы, функции.
Естественно я пробовал так,
Кликните здесь для просмотра всего текста
Delphi
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
procedure Obrab1(...);
type
  EmyExc1 = class(Exception);
  EmyExc2 = class(Exception);
begin
  try
    ...............
    if (...) then raise EmyExc1.Create('...');
    ...............
    if (...) then raise EmyExc2.Create('...');
    ...............
  except
    on E: EmyExc1 do procedure Obrab3(...);
    on E: EmyExc2 do procedure Obrab4(...);
    else ObrabCom(...);
  end;
end;
procedure Obrab2(...);
type
  EmyExc1 = class(Exception);
  EmyExc2 = class(Exception);
begin
  try
    ...............
    if (...) then raise EmyExc1.Create('...');
    ...............
    if (...) then raise EmyExc2.Create('...');
    ...............
  except
    on E: EmyExc1 do procedure Obrab5(...);
    on E: EmyExc2 do procedure Obrab6(...);
    else ObrabCom(...);
  end;
end;

Но компиллятор, "послал меня лесом".
0
krapotkin
3391 / 3006 / 1039
Регистрация: 14.04.2014
Сообщений: 14,578
Записей в блоге: 15
01.05.2017, 21:37 #6
там вместо else
on E:Exception
0
01.05.2017, 21:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.05.2017, 21:37

Вычислить значение функции двумя видами циклов
Составить 2 программы с циклом: 1. Цикл с предусловием 2. Цикл с постусловием

объясните разницу между двумя видами создания объекта
1. объект создается с помощью инициализатора car = { wheels: 4, ...

Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ...
Написать обработчик исключений ситуации при преобразовании указателя на класс B...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru