|
Обработка exception в DLL
|
|||
---|---|---|---|
#18+
Fr0sT-Brutal А, ты насчет данного конкретного случая. Просто утверждение прозвучало на редкость категорично, вот я и подумал - вдруг есть уже супер-мега-практика передавать исключения кросс-язычно, а я и не в курсе Я пока так и не понял, что "исключительно добродетельного" в отсутствии практики передачи исключений из А в Б. Если такое желание натыкается на нерешаемые технические проблемы... ну, очень печально, но эпитет "добродетельно" меня озадачил. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 11:59 |
|
Обработка exception в DLL
|
|||
---|---|---|---|
#18+
softwarer Я пока так и не понял, что "исключительно добродетельного" в отсутствии практики передачи исключений из А в Б. Если такое желание натыкается на нерешаемые технические проблемы... ну, очень печально, но эпитет "добродетельно" меня озадачил. А что, разве не добродетельно ловить все возможные исключения, чтобы софтина не падала с "недопустимой операцией"? Нормального-то способа передать исключение из dll нет. Или есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 17:07 |
|
Обработка exception в DLL
|
|||
---|---|---|---|
#18+
Fr0sT-Brutal А что, разве не добродетельно ловить все возможные исключения, чтобы софтина не падала с "недопустимой операцией"? Нормального-то способа передать исключение из dll нет. Или есть? Я не понимаю, о каком сценарии ты говоришь. Ну вот давай предположим, что в программе делается Код: pascal 1. 2. 3.
Ну или аналогичное на любом другом ЯП. Внимание, вопрос. Что такого должно произойти внутри MyProcedure, чтобы при отловленных в ней исключениях всё было хорошо, а при неотловленных - софтина упала? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 17:14 |
|
Обработка exception в DLL
|
|||
---|---|---|---|
#18+
softwarer Я не понимаю, о каком сценарии ты говоришь. Ну вот давай предположим, что в программе делается Код: pascal 1. 2. 3.
Ну или аналогичное на любом другом ЯП. Внимание, вопрос. Что такого должно произойти внутри MyProcedure, чтобы при отловленных в ней исключениях всё было хорошо, а при неотловленных - софтина упала? Да что угодно. Хоть открытие несуществующего или занятого файла. Тысячи причин, как ты сам же сказал - исключения это удобный инструмент реакции на ошибки в процессе, а не сигнал о фатальном крэше. Но даже при связке Delphi+Delphi без заморочек исключение через границы не передашь. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 18:12 |
|
Обработка exception в DLL
|
|||
---|---|---|---|
#18+
Fr0sT-Brutal Да что угодно. Хоть открытие несуществующего или занятого файла. Ну и? Я не понимаю, каким образом от "открытия несуществующего файла" дойдёт до "софтина упала". Можно конкретно? Fr0sT-Brutal Но даже при связке Delphi+Delphi без заморочек исключение через границы не передашь. При связке Delphi+Delphi нет никакой границы и никаких заморочек. Кроме тех, которые люди зачем-то делают сами себе без причины на пустом месте. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 18:15 |
|
Обработка exception в DLL
|
|||
---|---|---|---|
#18+
softwarer Fr0sT-Brutal Да что угодно. Хоть открытие несуществующего или занятого файла. Ну и? Я не понимаю, каким образом от "открытия несуществующего файла" дойдёт до "софтина упала". Можно конкретно? Хм, сейчас sysutils добавляет обертку, которая выплевывает messagebox с текстом исключения. Падать не упадет, да. Тем не менее, получить его из DLL тоже мало радости, особенно если это невизуальный жеватель данных. softwarer Fr0sT-Brutal Но даже при связке Delphi+Delphi без заморочек исключение через границы не передашь. При связке Delphi+Delphi нет никакой границы и никаких заморочек. Кроме тех, которые люди зачем-то делают сами себе без причины на пустом месте. Ну так расскажи, как обрабатывать исключения, кинутые в DLL, из программы-вызывателя ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 19:22 |
|
Обработка exception в DLL
|
|||
---|---|---|---|
#18+
Fr0sT-Brutal Хм, сейчас sysutils добавляет обертку, которая выплевывает messagebox с текстом исключения. Падать не упадет, да. Ты вот про эту обёртку? Так она существует со времён Delphi 1, и DLL не привносит сюда никакой специфики. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Fr0sT-Brutal Тем не менее, получить его из DLL тоже мало радости, особенно если это невизуальный жеватель данных. Радость здесь вообще какая-то странная эмоция. Скажем так, её всяко больше по сравнению с "кодами возврата", GetLastError-ами и прочими костылями выпуска 1970-х. Fr0sT-Brutal Ну так расскажи, как обрабатывать исключения, кинутые в DLL, из программы-вызывателя Да как хочешь. Вот представь себе, что у тебя есть процедура DoSomethingInteresting. Которая "невизуальный жеватель данных" или что угодно ещё. Ты вызываешь эту процедуру где-то в своей программе, обрабатываешь исключения из неё как считаешь правильным. Так вот, если эта процедура лежит в DLL - и, соответственно, исключение брошено из DLL - вообще ничего не меняется. Ни одной строчки кода. Всё как работало, так и работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.02.2022, 19:36 |
|
Обработка exception в DLL
|
|||
---|---|---|---|
#18+
softwarer Ты вот про эту обёртку? Так она существует со времён Delphi 1, и DLL не привносит сюда никакой специфики. Нет, я про SysUtils.ExceptHandler. В DLL я Forms не подключаю, слава богу, не требуется этого изврата. softwarer Да как хочешь. Вот представь себе, что у тебя есть процедура DoSomethingInteresting. Которая "невизуальный жеватель данных" или что угодно ещё. Ты вызываешь эту процедуру где-то в своей программе, обрабатываешь исключения из неё как считаешь правильным. Так вот, если эта процедура лежит в DLL - и, соответственно, исключение брошено из DLL - вообще ничего не меняется. Ни одной строчки кода. Всё как работало, так и работает. Хм, а знаешь, и в самом деле так. Поразительно. Delphi и тут соломки подстелил. Любопытно, как это работает - через Winapi? И будет ли работать с разными версиями компилятора. Тем не менее, сомневаюсь, что это будет надежно работать кросс-язычно. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 11:11 |
|
Обработка exception в DLL
|
|||
---|---|---|---|
#18+
Это работает через виртуальные методы. Это будет работать, только если DLL и хост собраны в одной/совместимой версии компилятора. Например, ANSI DLL не будет работать в Unicode Host и наоборот. Также это не будет работать, если от исключения надо не просто показать сообщение от него, а сделать что-либо ещё - например, изменить (если только не подключен общий менеджер памяти). Также не будет работать фильтрация исключений (если только она не выполняется по тексту имени класса, либо и DLL и host собраны с пакетами, содержащими класс исключения). Короче говоря, "если" тут действительно много, про них все нужно знать и уметь обходить. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 12:37 |
|
Обработка exception в DLL
|
|||
---|---|---|---|
#18+
GunSmoker Короче говоря, "если" тут действительно много, про них все нужно знать и уметь обходить. Тут ровно одна галочка в настройках, которую надо поставить. После чего не требуется ничего обходить, да и знать кроме этой галочки тоже не обязательно. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 12:41 |
|
Обработка exception в DLL
|
|||
---|---|---|---|
#18+
GunSmoker Это работает через виртуальные методы Можешь пояснить, о чем речь? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 14:25 |
|
Обработка exception в DLL
|
|||
---|---|---|---|
#18+
На уровне ОС программные исключения кидаются как запись (record). В записи указывается уникальный фиксированный код Delphi исключений и ссылка на объект Delphi. "Принимающая" сторона может увидеть код Delphi в записи и понять, что это - Delphi исключение. Из записи же прочитать ссылку на объект. Если раскладка в памяти совпадает - сможет прочитать из него свойство-строку (сообщение). При выходе из except блока исключение нужно удалить. Делается это вызовом деструктора. В Delphi деструкторы всех объектов - виртуальные. Это значит, что в VMT объекта есть ссылка на код деструктора. Следовательно, "принимающая" сторона вызовет код по ссылке, указанной в самом объекте. Это будет код в другом модуле, который и так знает, как нужно удалить переданный ему объект (в плане какие функции управления памятью вызывать). Если бы деструктор не был виртуальным, то при попытке очистке памяти объекта были бы вызваны функции не того менеджера памяти. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2022, 17:11 |
|
|
start [/forum/search_topic.php?author=J0kerS&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 10689ms |
total: | 10832ms |
0 / 0 |