(изменено: Владимир Яджак, 29 декабря 2010г. 15:35:21)

Тема: Замена встроенного обработчика исключений собственным.

В с++ есть возможность установить свои обработчики исключений для приложения. Вопрос: Возможно ли такое для программы написанной с использованием ObjectARX, если да то как?

Есть некоторые соображения по этому поводу.
Вот этот класс "AcDbHostApplicationServices" имеет следующие функции:

virtual void reportUnhandledArxException(
    const _EXCEPTION_POINTERS * pExcPtrs, 
    const ACHAR * pAppName
);

и

virtual void fatalError(
    const ACHAR * format, 
    ...
);

Но я так понимаю чтоб их использовать нужно наследоваться от этого класса и перегрузить их.
Как указать программе что нужно использовать именно унаследованный класс, а не класс по умолчанию.
Да и самое главное нужно не навредить программе.

Может есть другие варианты.

Re: Замена встроенного обработчика исключений собственным.

Здесь на форуме я нашел чтото аналогичное на лисп. Но лисп не подходит.

Re: Замена встроенного обработчика исключений собственным.

А try/catch не пойдут?
Перегрузить этот класс можно так: https://www.caduser.ru/forum/post224292.html#p224292
На лиспе нельзя обработать исключения AutoCAD в том смысле, в котором ты это понимаешь.

Re: Замена встроенного обработчика исключений собственным.

Спасибо, я попробую.
Только, действительно ли вышеперечисленные функции отвечают за необработанные или неожиданные исключения?

Re: Замена встроенного обработчика исключений собственным.

И как их правильно перегружать?
Если я перегружу только эти 2 метода, а другие нет все будет хорошо?

Re: Замена встроенного обработчика исключений собственным.

Владимир Яджак пишет:

И как их правильно перегружать? Если я перегружу только эти 2 метода, а другие нет все будет хорошо?

Нет. Перегрузить придется всё.

Re: Замена встроенного обработчика исключений собственным.

А если я не знаю как какой метод перегружать.
Можно просто вызывать родительские методы?

Re: Замена встроенного обработчика исключений собственным.

А try/catch не пойдут?

А если возникает какой то ексепшин при доступе к неинициализированному указателю вне блока try/catch. То хотелось бы вывести свое окошко с сообщением об ошибке, собрать логи, и попросить отправить письмо в службу техподдрежки. Вот что меня интересует.

(изменено: Владимир Яджак, 30 декабря 2010г. 11:06:19)

Re: Замена встроенного обработчика исключений собственным.

Возможно метод описанный https://www.caduser.ru/forum/post224292.html#p224292 не подходит для решения моей задачи.

Re: Замена встроенного обработчика исключений собственным.

Владимир Яджак пишет:

А если я не знаю как какой метод перегружать. Можно просто вызывать родительские методы?

Нет.  Нужно вызвать соответствующий метод для m_pOld.

Владимир Яджак пишет:

Возможно метод описанный https://www.caduser.ru/forum/post224292.html#p224292 не подходит для решения моей задачи.

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

Re: Замена встроенного обработчика исключений собственным.

Владимир Яджак,
злостный топик-апщик  :D  :D  :D

Re: Замена встроенного обработчика исключений собственным.

Что именно я хотел?
Вот пример аналога для простенького приложения на с++
http://www.cplusplus.com/reference/std/ … terminate/
http://www.cplusplus.com/reference/std/ … nexpected/
Хочу такое же для ObjectARX приложений.
То есть иметь свой handler для неотловленных исключений. И иметь возможность управлять завершением программы, при возникновении такого исключения.

Re: Замена встроенного обработчика исключений собственным.

AutoCAD устанавливает свой обработчик.

Re: Замена встроенного обработчика исключений собственным.

А нельзя стандартный обработчик заменить своим?

(изменено: Александр Пекшев aka Modis, 30 декабря 2010г. 10:27:20)

Re: Замена встроенного обработчика исключений собственным.

Не понимаю вот - зачем его менять? Надо стандартный акадовский обрабатывать. Отловил ошибку - и делай что хочешь ))

Re: Замена встроенного обработчика исключений собственным.

Не понимаю вот - зачем его менять? Надо стандартный акадовский обрабатывать. Отловил ошибку - и делай что хочешь ))

Поймите суть. Если отловил? То и обрабатываю. Но если не отловил. Где - то указатель нулевой попался, или доступа на запись в файл или диск нету, генерируются Unhandled exception. Вот именно при возникновении необработанных исключений я хочу вывести свою информацию пользователю, а не стандартное автокадовское сообщение об ошибке!

Re: Замена встроенного обработчика исключений собственным.

Владимир Яджак пишет:

А нельзя стандартный обработчик заменить своим?

Ну вот как раз через наследование AcDbHostApplicationServices и перегрузку его методов, как я уже писал это (теоретически) можно сделать. Другое дело, что вместо того, чтобы отловить ошибки ты можешь сам "развалить" AutoCAD. Ибо это дело очень тонкое...
Есть пара недокументированных функций:

void __cdecl acedDisableDefaultARXExceptionHandler(int);
long __stdcall acadUnhandledExceptionFilter(struct _EXCEPTION_POINTERS *);

Если не боишься - экспериментируй.

Re: Замена встроенного обработчика исключений собственным.

Не знаю как на счет ARX, но в .NET "оборачиваете" нужную часть программы в try/catch/finaly и выводите нужное сообщение. Допустим если вы знаете, что может не быть доступа к файлу, то часть кода, которая пытается получить доступ к файлу, "оборачиваете" в try/catch и выводите нужное сообщение. Тем более в обработке catch также можно задавать условия - если такая ошибка, то пишем это, если другая - пишем то.

Re: Замена встроенного обработчика исключений собственным.

Александр Пекшев aka Modis пишет:

Не знаю как на счет ARX, но в .NET "оборачиваете" нужную часть программы в try/catch/finaly и выводите нужное сообщение. Допустим если вы знаете, что может не быть доступа к файлу, то часть кода, которая пытается получить доступ к файлу, "оборачиваете" в try/catch и выводите нужное сообщение. Тем более в обработке catch также можно задавать условия - если такая ошибка, то пишем это, если другая - пишем то.

Это ты классно придумал!  :D  ;)