Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 49 50 51 52 53 54 55 56 [57] 58   вперед  Ctrl
 Re: Топик "как я лажанулся"  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
_Vasilisk_
Так вроде же раньше так можно было делать. Нет?

Не знаю, у каждого свое "раньше" :) на ХЕ2 был бадабум. Да и на любых версиях будет, скорее всего. Т.к. при выходе из except блока захваченный объект исключения удаляется.
2 апр 21, 10:31    [22303250]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 65410
Блог
_Vasilisk_
Так вроде же раньше так можно было делать. Нет?

Можно было делать raise без параметра - именно с этим смыслом. Либо raise новое_исключение. А вот смешивание давало не лучший результат (хотя, конечно, в компилятор можно было бы и встроить понимание того, что raise E и просто raise - синонимы).
2 апр 21, 11:07    [22303265]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32207

02.04.2021 10:31, Fr0sT-Brutal пишет:
>
> Не знаю, у каждого свое "раньше" :) на ХЕ2 был бадабум. Да и на любых версиях будет, скорее всего.
> Т.к. при выходе из except блока захваченный объект исключения удаляется.

так то при выходе.
а ты ж пишешь внутри блока.
хотя х.з., я лично не проверял.

зы: в исходниках RTL и VCL такая конструкция не встречается.

Posted via ActualForum NNTP Server 1.5

2 апр 21, 11:11    [22303267]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
JayDi
Member

Откуда: Сызрань, Россия
Сообщений: 4173
Тоже сталкивался с багами, когда повторный вызов исключения не вызывался, потому что выкидывалось только что пойманное исключение типа "raise e" вместо создания нового.
2 апр 21, 11:16    [22303272]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 5101
Повторный raise для обработанного exception
2 апр 21, 11:17    [22303273]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12789
Kazantsev Alexey
Повторный raise для обработанного exception
Ну это вынос объекта за пределы except блока, а мы говорим о повторном поднятии.

Хотя да, сейчас прикинул, что raise E работать не могло. Что-то я напутал. Или скорее всего спутал с throw e
2 апр 21, 11:33    [22303281]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 65410
Блог
Так или иначе, я ещё где-то во времена Delphi 4 выработал вот такой стиль кодирования:

procedure SaveToFile(const AFileName: string);
begin
  try
    ....
  except
    on E: Exception do
    begin
      ...
      raise AddExceptionHeaderFooter(E, 'Ошибка при записи файла', [], 'Файл: %s', [AFileName]);
    end;
  end;
end;

В результате получаются информативные сообщения об ошибках, которые по факту часто лучше стектрейса, плюс никаких проблем с синтаксисом. Всегда либо raise Exception.Create (вне блока except), либо raise AddException[Header][Footer] (который суть такой же Create) внутри except.
2 апр 21, 12:02    [22303294]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 62646
МП> в D7 точно компилится.

Что именно - приведение типа строка к типу Exception? Точно-точно?

Posted via ActualForum NNTP Server 1.5

2 апр 21, 12:12    [22303301]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 62646
softwarer> raise AddExceptionHeaderFooter(E, 'Ошибка при записи файла', [],

Тип эксепшена сохранял или подменял?

Posted via ActualForum NNTP Server 1.5

2 апр 21, 12:13    [22303303]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 65410
Блог
Гаджимурадов Рустам
Тип эксепшена сохранял или подменял?

Сохранял, конечно. Хотя не сказать, чтобы это было где-то особо нужно.
2 апр 21, 12:15    [22303305]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
softwarer
Так или иначе, я ещё где-то во времена Delphi 4 выработал вот такой стиль кодирования:

procedure SaveToFile(const AFileName: string);
begin
  try
    ....
  except
    on E: Exception do
    begin
      ...
      raise AddExceptionHeaderFooter(E, 'Ошибка при записи файла', [], 'Файл: %s', [AFileName]);
    end;
  end;
end;

В результате получаются информативные сообщения об ошибках, которые по факту часто лучше стектрейса, плюс никаких проблем с синтаксисом. Всегда либо raise Exception.Create (вне блока except), либо raise AddException[Header][Footer] (который суть такой же Create) внутри except.


Прикол в том, что при выходе из блока пойманный эксепшен удаляется (см. System._DoneExcept)

type
  Etest = class(Exception)
    destructor Destroy; override;
  end;

{ Etest }

destructor Etest.Destroy;
begin
  MsgBox('Destroy!');
  inherited;
end;

var save_e: exception = nil;

procedure TForm1.Button2Click(Sender: TObject);
begin
  try
    raise etest.Create('Error Message');
  except on E: Exception do
    save_e := e;
  end;
end;
2 апр 21, 12:24    [22303320]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 65410
Блог
Fr0sT-Brutal
Прикол в том, что при выходе из блока пойманный эксепшен удаляется

И что?
2 апр 21, 12:45    [22303334]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 62646
softwarer> Хотя не сказать, чтобы это было где-то особо нужно.

Централизованную обработку эксепшенов не любишь?
Или тип только в лог попадал и ничего более?

Posted via ActualForum NNTP Server 1.5

2 апр 21, 12:55    [22303340]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
softwarer
Fr0sT-Brutal
Прикол в том, что при выходе из блока пойманный эксепшен удаляется

И что?

Ничего, просто если его куда-то передавать асинхронно или сохранять на будущее, будет ой
2 апр 21, 13:20    [22303357]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 65410
Блог
Гаджимурадов Рустам
Централизованную обработку эксепшенов не любишь?

Да просто с ними редко можно сделать что-то более разумное, чем показать пользователю/записать в лог.
2 апр 21, 13:30    [22303365]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32207

02.04.2021 13:30, softwarer пишет:
> Да просто с ними редко можно сделать что-то более разумное, чем показать пользователю/записать в лог.

можно погасить приложение, если дальнейшая корректная работа далее невозможна.
ну а в лог записать, это таки да.

Posted via ActualForum NNTP Server 1.5

2 апр 21, 13:33    [22303368]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
А я как раз сделал централизованную обработку, когда ловил баг с порчей памяти. Добавил механизм закрытия при критических исключениях, когда продолжать не стоит, можно еще больше навредить
// Является ли исключение критическим, после которого нежелательно продолжать
function IsCriticalException(E: Exception): Boolean;
begin
  Result :=
    (E is EAccessViolation) or
    (E is EHeapException); // OutOfMem сюда же
end;
2 апр 21, 17:56    [22303478]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 65410
Блог
Мимопроходящий
можно погасить приложение, если дальнейшая корректная работа далее невозможна.

Довольно трудно определить, когда она невозможна, а когда - возможна, и более того, крайне желательна.
2 апр 21, 18:00    [22303479]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Cobalt747
Member

Откуда:
Сообщений: 2300
Наткнулся разбирая древние исходники:
procedure TExchFile.Free;
begin
  if fIsDinamicStr then
    SetLength(fStr^, fPos);
  inherited Free;
end;
6 апр 21, 16:43    [22305120]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 65410
Блог
Cobalt747,

Креативно :) Но, по крайней мере, видно, что автор тщательно пользуется верной рекомендацией использовать Free :)
6 апр 21, 16:49    [22305122]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1966
Cobalt747,

ну и что?
var
  fStr : PString(*^AnsiString*) 

Если в деструкторе не убивается - значит, используется где-то ещё. Мало ли какая логика у остального кода.
6 апр 21, 17:28    [22305132]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2483
Fr0sT-Brutal
А я как раз сделал централизованную обработку, когда ловил баг с порчей памяти. Добавил механизм закрытия при критических исключениях, когда продолжать не стоит, можно еще больше навредить
// Является ли исключение критическим, после которого нежелательно продолжать
function IsCriticalException(E: Exception): Boolean;
begin
  Result :=
    (E is EAccessViolation) or
    (E is EHeapException); // OutOfMem сюда же
end;

EAccessViolation - в 99% случаев совершенно безопасна. Не опаснее ListIndexOutOfBounds.
6 апр 21, 18:15    [22305154]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Cobalt747
Member

Откуда:
Сообщений: 2300
ъъъъъ
Cobalt747,

ну и что?
var
  fStr : PString(*^AnsiString*) 

Если в деструкторе не убивается - значит, используется где-то ещё. Мало ли какая логика у остального кода.

Вот только если объект = nil, то получишь AV при обращении к полям
6 апр 21, 18:33    [22305163]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1966
Cobalt747, к каким ещё "полям" у строки?
И - не только nil, а просто "неинициализация", но - там флажок в IF проверяется какой-то, не заметил?

Сообщение было отредактировано: 6 апр 21, 18:39
6 апр 21, 18:45    [22305168]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 65410
Блог
ъъъъъ
Cobalt747, к каким ещё "полям" у строки?

Подумай получше. Представь себе, как это будет работать при

var F: TExchFile;
  ....
  F := nil;
  ....
  F.Free;
end;
6 апр 21, 20:33    [22305190]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 49 50 51 52 53 54 55 56 [57] 58   вперед  Ctrl
Все форумы / Delphi Ответить