![]() |
|
|
![]()
|
|
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Вот у Виндовоза в случае ошибки приложения выскакивает сообщение со словами "Приложение совершило недопустимую ошибку...". И там есть кнопки кажись Завершить, Подробнее, Отладка. И вот если щёлкнуть по кнопке "Подробнее", то можно просмотреть содержимое регистров процессора и стека.
Это сообщение, если не ошибаюсь выводит обработчик Винды, установленный по-умолчанию для всех приложений. Но ведь наверняка можно для своего приложения установить свой такой обработчик. Как это сделать? Пишу на BCB6 -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Приложение большое, несколько юнитов, несколько потоков. Везде блоки try... catch. замучаюсь ставить, поэтому хотелось бы такой глобальный обработчик. Фатальную ошибку отловить не могу.
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| ilyalyu |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 25.10.2006 Репутация: нет Всего: нет |
В TApplication можно обрабатывать событие OnException
Добавляешь в главной форме обработчик: procedure TForm1.OnException(Sender: TObject; e: Exception); а потом присваиваешь его вот так: Application.OnException := Form1.OnException; На c++, думаю, сможешь переписать Это сообщение отредактировал(а) ilyalyu - 16.7.2007, 09:54 |
|||
|
||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
А оно точно отрабатывается, когда приложение совершает недопустимую операцию и его убивает Windows?
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| ilyalyu |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 25.10.2006 Репутация: нет Всего: нет |
Вот чего не знаю, того не знаю.
|
|||
|
||||
| ksili |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Ну у формы я не нашёл события OnException. Но сейчас не в этом проблема. Просто создаю свою функцию и пытаюсь её назначить в качестве обработчика события Application->OnException. И что-то Билдер ругается на аргументы функции. Моя функция:
В конструкторе формы пишу:
и вот именно на этой строке возникает такая мудрёная ошибка:
Что надо поправить в объявлении функции или назначении обработчика события? Это сообщение отредактировал(а) ksili - 16.7.2007, 12:26 -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
||||||
|
|||||||
| ksili |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Посмотрел в хелпе и сделал так:
Объявление функции:
Назначение обработчика:
Плюс ко всему сделал OnGlobalError членом класса формы -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
||||
|
|||||
| ilyalyu |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 25.10.2006 Репутация: нет Всего: нет |
ksili,
"Ну у формы я не нашёл события OnException" А там и нет такого события. Тебе надо в TForm1 определить функцию, которая будте обрабатывать событие OnException. Можешь назвать ее, например, MyOnException. Делается это примерно так (привожу пример на паскале):
А затем присваиваешь событию OnException ссылку на эту функцию. Это выглядит примерно так:
"и вот именно на этой строке возникает такая мудрёная ошибка:" Мудренная ошибка возникает скорей всего потому, что ты пытаешья присвоить событию OnException адрес функции, которая не является методом класса (потому я и пишу, что функцию надо определить внутри класса TForm1). А может просто не хватает оператора "&". Это сообщение отредактировал(а) ilyalyu - 18.7.2007, 18:10 |
||||
|
|||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Да я уже всё так и сделал, о чём и написано в предыдущем посте. Обработчик работает, но вот сомневаюсь я, что он сработает, когда приложение совершило недопустимую операцию и будет закрыто
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| ilyalyu |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 25.10.2006 Репутация: нет Всего: нет |
а ты попробуй. добавь где-нибудь деление на ноль, например, и посмотри.
|
|||
|
||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
я просто генерировал исключение так:
мой обработчик при этом выполняется. Но приложение при этом не закрывается, поэтому это не тот случай. Я уже столкнулся с реальной ситауцией, когда приложение совершило недопустимую операцию и будет закрыто и мой обработчик при этом не выполнился -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| HappyLife |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 642 Регистрация: 17.5.2006 Репутация: 4 Всего: 8 |
ksili,
Когда ты обрабатываешь исключение приложение не будет закрываться, если не указывается обратного в коде самой обработки. Добавлено через 8 минут и 56 секунд Я думаю, что в приложениях Бильдера так не сделать. Возьми к примеру обыкновенный Code::Blocks. Выполни операцию деления на нуль, и приложение вызовет эту ошибку. Добавлено через 9 минут и 18 секунд А так в любом случае, приложение завершается при срабатывании исключения. |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 18 Всего: 154 |
Вообще билдер обрабатывает исключения (необработанные) с помощю try блока в main ф-ии проекта, поэтому генерация исключения не должна приводить к завершению работы программы.
Так-что можно это под свои нужды переделать, например в лог писать или баг репорт посылать. Я однажды видел прогу, которая перед смертью открывала свой лог блокнотом, а в логе - предложение отправить этот файл авторам. Мне сразу такое захотелось туда написать ЗЫ Если прога многопоточная, то нужно в каждом потоке отдельно исключения обрабатывать. |
|||
|
||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Точно, про юнит проекта я и забыл. А в каком из этих трёх catch'ей лучше вставить свой код? Мне как раз в лог и надо писать.
Про потоки тоже учту -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 18 Всего: 154 |
Наверное можно и свой добавить:
Вообще исключения желательно не только в лог писать, но и пытаться их обработать как можно ближе к месту возникновения, для того чтобы можно было восстановить нормальный ход работы программы. |
||||
|
|||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |