powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Обработка exception в DLL
12 сообщений из 62, страница 3 из 3
Обработка exception в DLL
    #40136672
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal
А, ты насчет данного конкретного случая. Просто утверждение прозвучало на редкость категорично, вот я и подумал - вдруг есть уже супер-мега-практика передавать исключения кросс-язычно, а я и не в курсе

Я пока так и не понял, что "исключительно добродетельного" в отсутствии практики передачи исключений из А в Б. Если такое желание натыкается на нерешаемые технические проблемы... ну, очень печально, но эпитет "добродетельно" меня озадачил.
...
Рейтинг: 0 / 0
Обработка exception в DLL
    #40136740
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer
Я пока так и не понял, что "исключительно добродетельного" в отсутствии практики передачи исключений из А в Б. Если такое желание натыкается на нерешаемые технические проблемы... ну, очень печально, но эпитет "добродетельно" меня озадачил.

А что, разве не добродетельно ловить все возможные исключения, чтобы софтина не падала с "недопустимой операцией"? Нормального-то способа передать исключение из dll нет. Или есть?
...
Рейтинг: 0 / 0
Обработка exception в DLL
    #40136744
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal
А что, разве не добродетельно ловить все возможные исключения, чтобы софтина не падала с "недопустимой операцией"? Нормального-то способа передать исключение из dll нет. Или есть?

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

Код: pascal
1.
2.
3.
hLib := LoadLibrary('my.dll');
pProc := GetProcAddress(hLib, 'MyProcedure');
pProc^(1, 2, 3, 4, 5);


Ну или аналогичное на любом другом ЯП. Внимание, вопрос. Что такого должно произойти внутри MyProcedure, чтобы при отловленных в ней исключениях всё было хорошо, а при неотловленных - софтина упала?
...
Рейтинг: 0 / 0
Обработка exception в DLL
    #40136760
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer

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

Код: pascal
1.
2.
3.
hLib := LoadLibrary('my.dll');
pProc := GetProcAddress(hLib, 'MyProcedure');
pProc^(1, 2, 3, 4, 5);


Ну или аналогичное на любом другом ЯП. Внимание, вопрос. Что такого должно произойти внутри MyProcedure, чтобы при отловленных в ней исключениях всё было хорошо, а при неотловленных - софтина упала?

Да что угодно. Хоть открытие несуществующего или занятого файла. Тысячи причин, как ты сам же сказал - исключения это удобный инструмент реакции на ошибки в процессе, а не сигнал о фатальном крэше. Но даже при связке Delphi+Delphi без заморочек исключение через границы не передашь.
...
Рейтинг: 0 / 0
Обработка exception в DLL
    #40136762
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal
Да что угодно. Хоть открытие несуществующего или занятого файла.

Ну и? Я не понимаю, каким образом от "открытия несуществующего файла" дойдёт до "софтина упала". Можно конкретно?

Fr0sT-Brutal
Но даже при связке Delphi+Delphi без заморочек исключение через границы не передашь.

При связке Delphi+Delphi нет никакой границы и никаких заморочек. Кроме тех, которые люди зачем-то делают сами себе без причины на пустом месте.
...
Рейтинг: 0 / 0
Обработка exception в DLL
    #40136777
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer
Fr0sT-Brutal
Да что угодно. Хоть открытие несуществующего или занятого файла.

Ну и? Я не понимаю, каким образом от "открытия несуществующего файла" дойдёт до "софтина упала". Можно конкретно?

Хм, сейчас sysutils добавляет обертку, которая выплевывает messagebox с текстом исключения. Падать не упадет, да. Тем не менее, получить его из DLL тоже мало радости, особенно если это невизуальный жеватель данных.

softwarer
Fr0sT-Brutal
Но даже при связке Delphi+Delphi без заморочек исключение через границы не передашь.

При связке Delphi+Delphi нет никакой границы и никаких заморочек. Кроме тех, которые люди зачем-то делают сами себе без причины на пустом месте.

Ну так расскажи, как обрабатывать исключения, кинутые в DLL, из программы-вызывателя
...
Рейтинг: 0 / 0
Обработка exception в DLL
    #40136781
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-Brutal
Хм, сейчас sysutils добавляет обертку, которая выплевывает messagebox с текстом исключения. Падать не упадет, да.

Ты вот про эту обёртку? Так она существует со времён Delphi 1, и DLL не привносит сюда никакой специфики.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure TApplication.Run;
begin
  ...
  repeat
    try
      HandleMessage;
    except
      HandleException(Self);
    end;
  until Terminated;
  ...
end;



Fr0sT-Brutal
Тем не менее, получить его из DLL тоже мало радости, особенно если это невизуальный жеватель данных.

Радость здесь вообще какая-то странная эмоция. Скажем так, её всяко больше по сравнению с "кодами возврата", GetLastError-ами и прочими костылями выпуска 1970-х.

Fr0sT-Brutal
Ну так расскажи, как обрабатывать исключения, кинутые в DLL, из программы-вызывателя

Да как хочешь. Вот представь себе, что у тебя есть процедура DoSomethingInteresting. Которая "невизуальный жеватель данных" или что угодно ещё. Ты вызываешь эту процедуру где-то в своей программе, обрабатываешь исключения из неё как считаешь правильным. Так вот, если эта процедура лежит в DLL - и, соответственно, исключение брошено из DLL - вообще ничего не меняется. Ни одной строчки кода. Всё как работало, так и работает.
...
Рейтинг: 0 / 0
Обработка exception в DLL
    #40136852
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer
Ты вот про эту обёртку? Так она существует со времён Delphi 1, и DLL не привносит сюда никакой специфики.

Нет, я про SysUtils.ExceptHandler. В DLL я Forms не подключаю, слава богу, не требуется этого изврата.

softwarer
Да как хочешь. Вот представь себе, что у тебя есть процедура DoSomethingInteresting. Которая "невизуальный жеватель данных" или что угодно ещё. Ты вызываешь эту процедуру где-то в своей программе, обрабатываешь исключения из неё как считаешь правильным. Так вот, если эта процедура лежит в DLL - и, соответственно, исключение брошено из DLL - вообще ничего не меняется. Ни одной строчки кода. Всё как работало, так и работает.

Хм, а знаешь, и в самом деле так. Поразительно. Delphi и тут соломки подстелил. Любопытно, как это работает - через Winapi? И будет ли работать с разными версиями компилятора. Тем не менее, сомневаюсь, что это будет надежно работать кросс-язычно.
...
Рейтинг: 0 / 0
Обработка exception в DLL
    #40136876
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это работает через виртуальные методы. Это будет работать, только если DLL и хост собраны в одной/совместимой версии компилятора. Например, ANSI DLL не будет работать в Unicode Host и наоборот. Также это не будет работать, если от исключения надо не просто показать сообщение от него, а сделать что-либо ещё - например, изменить (если только не подключен общий менеджер памяти). Также не будет работать фильтрация исключений (если только она не выполняется по тексту имени класса, либо и DLL и host собраны с пакетами, содержащими класс исключения).

Короче говоря, "если" тут действительно много, про них все нужно знать и уметь обходить.
...
Рейтинг: 0 / 0
Обработка exception в DLL
    #40136877
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmoker
Короче говоря, "если" тут действительно много, про них все нужно знать и уметь обходить.

Тут ровно одна галочка в настройках, которую надо поставить. После чего не требуется ничего обходить, да и знать кроме этой галочки тоже не обязательно.
...
Рейтинг: 0 / 0
Обработка exception в DLL
    #40136895
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GunSmoker
Это работает через виртуальные методы

Можешь пояснить, о чем речь?
...
Рейтинг: 0 / 0
Обработка exception в DLL
    #40136928
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На уровне ОС программные исключения кидаются как запись (record). В записи указывается уникальный фиксированный код Delphi исключений и ссылка на объект Delphi.

"Принимающая" сторона может увидеть код Delphi в записи и понять, что это - Delphi исключение. Из записи же прочитать ссылку на объект. Если раскладка в памяти совпадает - сможет прочитать из него свойство-строку (сообщение).

При выходе из except блока исключение нужно удалить. Делается это вызовом деструктора. В Delphi деструкторы всех объектов - виртуальные. Это значит, что в VMT объекта есть ссылка на код деструктора. Следовательно, "принимающая" сторона вызовет код по ссылке, указанной в самом объекте. Это будет код в другом модуле, который и так знает, как нужно удалить переданный ему объект (в плане какие функции управления памятью вызывать).

Если бы деструктор не был виртуальным, то при попытке очистке памяти объекта были бы вызваны функции не того менеджера памяти.
...
Рейтинг: 0 / 0
12 сообщений из 62, страница 3 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Обработка exception в DLL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (11): Анонимы (8), Bing Bot, Yandex Bot 1 мин., Google Bot 6 мин.
x
x
Закрыть


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