Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / [Lazarus/Delphi] Как ловить сразу несколько исключений? / 25 сообщений из 40, страница 1 из 2
03.06.2018, 19:21
    #39654548
Гвость
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
Можно ли ловить сразу три разных исключения? Как-то типа такого:
Код: pascal
1.
2.
3.
4.
5.
6.
try
    ...
except
    on EOne, ETwo, EThree do
        ...
    end;
...
Рейтинг: 0 / 0
03.06.2018, 19:29
    #39654555
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
ГвостьМожно ли ловить сразу три разных исключения? Как-то типа такого:
Код: pascal
1.
2.
3.
4.
5.
6.
try
    ...
except
    on EOne, ETwo, EThree do
        ...
    end;


а ты подумал уже, как ты внутри блока будешь понимать, какое исключение сработало ?
...
Рейтинг: 0 / 0
03.06.2018, 19:35
    #39654559
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
Гвость,

AFAIR, если ETwo и EThree - наследники EOne, то конструкция
Код: pascal
1.
on E: EOne do ...

будет реагировать и на них тоже.

Еще можно использовать совет отсюда :
Код: pascal
1.
2.
3.
4.
5.
except
  on E: Exception do
    if (E is EOne) or (E is ETwo) or (E is EThree) then 
      ...
    else ...
...
Рейтинг: 0 / 0
03.06.2018, 19:38
    #39654561
Гвость
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
defecator , дак в том-то и нюанс - мне и не нужно понимать какое из трёх (или более) сработало.
Надо выполнить абсолютно одно и то же действие при любом из указанных исключений.

Конечно можно и вот так, но не будет ли как-то криво?:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
procedure ...
    procedure OnMyExps();
    begin
    ...
    end;
begin
try
    ...
except
    on EOne do
        OnMyExps();
    on ETwo do
        OnMyExps();
    on EThree do
        OnMyExps();
    end;
end;



P.S. Нет, не наследники.
...
Рейтинг: 0 / 0
03.06.2018, 19:45
    #39654564
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
Гвость,

Можно как вы написали, можно как я выше писал:
Проверил, в XE2 работает
Код: pascal
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.
program ExceptTest;

{$APPTYPE CONSOLE}

uses
  System.SysUtils;

type
  EOne = class(Exception);
  ETwo = class(Exception);
  EThree = class(Exception);

begin
  try
//    raise EOne.Create('Error Message');
//    raise ETwo.Create('Error Message');
//    raise EThree.Create('Error Message');
    raise Exception.Create('Error Message');
  except
    on E: Exception do
      if (E is EOne) or (E is ETwo) or (E is EThree) then
        Writeln('Hey! It''s my Exception!')
      else Writeln(E.ClassName, ': ', E.Message);
  end;
  ReadLn;
end.

...
Рейтинг: 0 / 0
03.06.2018, 20:02
    #39654565
Гвость
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
То есть сам язык не позволяет? Просто раз в Case можно... через запятую-то... подумал и тут как-то можно...
Ладно, да будем так, спасибо большое!
...
Рейтинг: 0 / 0
03.06.2018, 20:21
    #39654567
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
Гвость defecator , дак в том-то и нюанс - мне и не нужно понимать какое из трёх (или более) сработало.
Надо выполнить абсолютно одно и то же действие при любом из указанных исключений.

Конечно можно и вот так, но не будет ли как-то криво?:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
procedure ...
    procedure OnMyExps();
    begin
    ...
    end;
begin
try
    ...
except
    on EOne do
        OnMyExps();
    on ETwo do
        OnMyExps();
    on EThree do
        OnMyExps();
    end;
end;



этот вариант мне нравится больше остальных
...
Рейтинг: 0 / 0
03.06.2018, 22:42
    #39654600
чччД__
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
не люблю локальные (в функциях) функции.
...
Рейтинг: 0 / 0
04.06.2018, 00:12
    #39654607
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
чччД__,

зря. бывает очень удобно. код разгрузить.
...
Рейтинг: 0 / 0
04.06.2018, 00:37
    #39654609
чччД__
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
makhaon,

да, бывает. Но - не люблю. Сколько раз видел, как люди фигню с ними творили.
Например, локальные переменные во внутренних функциях одинаково с локальными во внешних называли и путались.
Или специально во вложенных функциях использовали локальные переменные внешних функций.
Эдакий локальный быдлокод, короче.
...
Рейтинг: 0 / 0
04.06.2018, 09:35
    #39654699
AWSVladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
чччД__makhaon,
да, бывает. Но - не люблю. Сколько раз видел, как люди фигню с ними творили.
Эдакий локальный быдлокод, короче.
Откройте для себя венгерскую нотацию или примите корпоративный стандарт написания.
Плюсом используйте форматер кода. Форматер можно настроить под себя, анти-корпоративный (когда из репозитария исходники получаем) и корпоративный, когда обратно в репозиторий заливаем.
...
Рейтинг: 0 / 0
04.06.2018, 11:23
    #39654748
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
в частности именно возможностью спрятать в себе локальные переменные, особенно кучу неявных от управляемых типов к-е порой бестолково дают просадку производительности, вложенные ф-ии и хороши
...
Рейтинг: 0 / 0
04.06.2018, 20:22
    #39655193
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
defecatorГвость defecator , дак в том-то и нюанс - мне и не нужно понимать какое из трёх (или более) сработало.
Надо выполнить абсолютно одно и то же действие при любом из указанных исключений.

Конечно можно и вот так, но не будет ли как-то криво?:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
procedure ...
    procedure OnMyExps();
    begin
    ...
    end;
begin
try
    ...
except
    on EOne do
        OnMyExps();
    on ETwo do
        OnMyExps();
    on EThree do
        OnMyExps();
    end;
end;



этот вариант мне нравится больше остальных
зря, как говорится "найди ошибку и больше так не делай", я один раз целый день потратил из-за такого
...
Рейтинг: 0 / 0
04.06.2018, 20:24
    #39655195
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
kealon(Ruslan)defecatorпропущено...


этот вариант мне нравится больше остальных
зря, как говорится "найди ошибку и больше так не делай", я один раз целый день потратил из-за такого

отладчик не дебажил ? бывает )
...
Рейтинг: 0 / 0
04.06.2018, 20:25
    #39655197
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
defecatorотладчик не дебажил ? бывает )покажи сенсей где растёт трава ;-)
...
Рейтинг: 0 / 0
04.06.2018, 20:39
    #39655204
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
кагбе молчком сглатывать необработанные исключения - порочная практика...
...
Рейтинг: 0 / 0
04.06.2018, 20:42
    #39655207
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
white_nigger,
:-)
...
Рейтинг: 0 / 0
04.06.2018, 20:46
    #39655208
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
white_niggerкагбе молчком сглатывать необработанные исключения - порочная практика...Где в коде гасятся исключения?
...
Рейтинг: 0 / 0
04.06.2018, 20:53
    #39655210
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
_Vasilisk_white_niggerкагбе молчком сглатывать необработанные исключения - порочная практика...Где в коде гасятся исключения?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
except
    on EOne do
        OnMyExps();
    on ETwo do
        OnMyExps();
    on EThree do
        OnMyExps();
    end;
// <- вот здесь (EOutOfMemory, EAccesViolation, EEtc...
end;
...
Рейтинг: 0 / 0
04.06.2018, 20:58
    #39655213
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
alekcvp_Vasilisk_пропущено...
Где в коде гасятся исключения?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
except
    on EOne do
        OnMyExps();
    on ETwo do
        OnMyExps();
    on EThree do
        OnMyExps();
    end;
// <- вот здесь (EOutOfMemory, EAccesViolation, EEtc...
end;



можно и вот так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
try
  ...
except
    on EOne do
        OnMyExps();
    on ETwo do
        OnMyExps();
    on EThree do
        OnMyExps();
    end;
  ...
else
  raise;
end;
...
Рейтинг: 0 / 0
05.06.2018, 14:11
    #39655599
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
alekcvp
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
except
    on EOne do
        OnMyExps();
    on ETwo do
        OnMyExps();
    on EThree do
        OnMyExps();
    end;
// <- вот здесь (EOutOfMemory, EAccesViolation, EEtc...
end

Что за бред?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
{$APPTYPE CONSOLE}
program Test;

uses
  System.SysUtils;
  
{$R+}

var
  Data: array[0..0] of Integer;
  i: Integer;
begin
  try
    i := 10;
    Data[i] := 5;
  except
    on E: EConvertError do
      Writeln('EConvertError')
  end;
  Writeln('End test');
end.

Test.exe >1 2>&1Exception ERangeError in module Test.exe at 0001D574.
Range check error.
Блок except обрабатывает
Код: pascal
1.
только

те исключения, которые были указаны. Остальные пропускаются дальше. Никто никого не гасит.
...
Рейтинг: 0 / 0
05.06.2018, 14:12
    #39655601
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
defecatorможно и вот так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
try
  ...
except
  ...
else
  raise;
end;

Можно. Но зачем?
...
Рейтинг: 0 / 0
05.06.2018, 14:22
    #39655613
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
_Vasilisk_defecatorможно и вот так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
try
  ...
except
  ...
else
  raise;
end;


Можно. Но зачем?
синтаксис позволяет
...
Рейтинг: 0 / 0
05.06.2018, 14:34
    #39655631
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
defecatorсинтаксис позволяеттак тоже позволяет
Код: pascal
1.
if MyVar = True then
...
Рейтинг: 0 / 0
05.06.2018, 14:37
    #39655634
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Lazarus/Delphi] Как ловить сразу несколько исключений?
_Vasilisk_defecatorсинтаксис позволяеттак тоже позволяет
Код: pascal
1.
if MyVar = True then


и что ?
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / [Lazarus/Delphi] Как ловить сразу несколько исключений? / 25 сообщений из 40, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]