Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Почему не работает перехватчик исключений?

8.2K
23 января 2006 года
TheMaster
32 / / 23.12.2005
Проблема в следующем: прога должна адекватно реагировать на исключения (не важно, какие). Читаю умную книжку, там написано: сделай то-то и то-то. Делаю: создаю новый проект, добавляю на голую форму одну кнопку и в обработчик нажатия пишу следующий сверхсложный код:
 
Код:
int a, b, c;
a = 10;
b = 0;
c = a/b;

Типа, генерю какое-то исключение.
Ладно, дальше добавляю обработчик этих исключений:

в заголовочном файле:
 
Код:
void _fastcall ExHandler(TObject *Sender, Exception *except);


в основном файле:
 
Код:
void _fastcall ExHandler(TObject *Sender, Exception *except)
{
Application->MessageBox("Упс... Ошибочка вышла","Чего-то непонятное", NULL);
}


Дальше надо этот обработчик подключить и по окончанию работы не забыть отключить. В общем, создаю два обработчика сообщений на форме - OnActivate и OnDeactivate, дописываю в первый:

 
Код:
Application->OnException = ExHandler;


Во второй:
 
Код:
Application->OnException = NULL;


Ну, в общем, дальше компилю, запускаю, появляется форма с кнопкой, я эту кнопку нажимаю, появляются нужные сообщения и всё в этом роде - короче, всё работает, как надо.
Дальше я открываю проект, с которым работаю. Прога посложнее, несколько файликов, три или четыре модальные формы и так далее. Короче, делаю абсолютно то же самое - и ни хрена, появляется сообщение о делении на нуль, по-английски, ессно, на мой обработчик прога - ноль внимания. Справка добросовестно повторяет слова умных книжек. Может, кто-нибудь скажет мне по этому поводу что-нибудь новенькое, чего я ещё не знаю?
16K
24 января 2006 года
Konstantin_STD
2 / / 24.01.2006
Дело в том что Builder всегда выдаёт сообщения об ошибке на этапе отлатдки. И твоё сообщение должно идти после сообщения от отладчика. И... я больше люблю использовать
try{
..kode..
}catch(...){ что делать..};
А то что ты юзаешь я как то попробывал,мне не понравилось.
8.2K
25 января 2006 года
TheMaster
32 / / 23.12.2005
Огород я затеял городить, чтобы решить простейшую проблему: надо в окошко редактирования загнать цифры и только цифры. Все нормальные люди делают очень просто: фильтруют нажатия клавиатуры и выделяют из них нажатия цифровых клавиш. Но я ж не как все, мне ж надо проблемы себе создать, чтоб потом их преодолевать героически! Есть специализированный компонент на вкладке Samples, TSpinEdit называется. Он-то как раз и предназначен для ввода цифр и только цифр. Однако вводить туда можно вообще-то всё, что угодно. При потере этим элементом фокуса он пытается перегнать строчку в своём окошке в число. Если у него это не получается, генерится исключение EConvertError, и строчка в окошке заменяется на ноль. Вот это-то исключение я и хотел перехватить. Однако через Try...Catch это сделать в принципе невозможно. Более того, через перехватчик исключений сделать это тоже не получится, поскольку исключение обрабатывается непосредственно в коде компонента и наружу не вылезает. Короче, сейчас я пишу новый компонент на основе строчки TEdit, который будет работать так, как мне нравится.

Не, если интересно - могу поделиться файлами...
1
25 января 2006 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by TheMaster
Огород я затеял городить, чтобы решить простейшую проблему: .... Короче, сейчас я пишу новый компонент на основе строчки TEdit, который будет работать так, как мне нравится.

Не, если интересно - могу поделиться файлами...


Да уж. Рекомендовал бы попытаться оформить патент на двухколесное средство передвижения при помощи педалей. :)

1
25 января 2006 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by TheMaster
Если у него это не получается, генерится исключение EConvertError, и строчка в окошке заменяется на ноль. Вот это-то исключение я и хотел перехватить. Однако через Try...Catch это сделать в принципе невозможно. ....


Могу в принципе поделится файлами в которых в принципе перехватывается исключение, которое в принципе для некоторых в принципе программистов в принципе не перехватываемо. В приципе хелп желательно читать.
И желательно до того как писать в форумы.

8.2K
27 января 2006 года
TheMaster
32 / / 23.12.2005
А нельзя ли поподробнее: какой именно раздел справки описывает перехват таких исключений? Я, конечно, не берусь утверждать, что прочитал всё, посвящённое классу Exception, но в том, что я просматривал, ответа так и не нашлось. Умные книжки рекомендуют два способа: один я описал выше, другой - через try...catch. Может, я что-то не знаю по поводу того, как применять один из них?
1
27 января 2006 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by TheMaster
А нельзя ли поподробнее: какой именно раздел справки описывает перехват таких исключений? Я, конечно, не берусь утверждать, что прочитал всё, посвящённое классу Exception, но в том, что я просматривал, ответа так и не нашлось. Умные книжки рекомендуют два способа: один я описал выше, другой - через try...catch. Может, я что-то не знаю по поводу того, как применять один из них?


Может мы просто не можем друг друга понять? Вот код:

Код:
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
 try{
 int i = StrToInt(Edit1->Text);
  ShowMessage("Это число");
 }
 catch(...){
  ShowMessage("нет Это не число");
   Edit1->Text = "0";
 }
}

Это работает и работает нормально. Можно указать конкретное исключение которое будет перехватывать этот обработчик. В чем собственно проблема? А обработчик приложения просто не успевает перехвать исключение - его обработает библиотека, если не захотел это сделать программист. Перехватывать подобные исключения в компоненте - достаточно серьезная ошибка.
Кстати, если добавить этот код вот таким:
Код:
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
 try{
 int i = StrToInt(Edit1->Text);
  ShowMessage("Это число");
 int g = i/0;
 }
 catch(...){
  ShowMessage("нет Это не число");
   Edit1->Text = "0";
 }
}

он тоже нормально отработает.
585
27 января 2006 года
honeybeer
297 / / 06.09.2004
Цитата:
Originally posted by kot_

Код:
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
 try{
 int i = StrToInt(Edit1->Text);
  ShowMessage("Это число");
 int g = i/0;
 }
 catch(...){
  ShowMessage("нет Это не число");
   Edit1->Text = "0";
 }
}

он тоже нормально отработает.


Только лучше все-таки отлавливать EConvertError &e. Всеядный обработчик - крайняя мера.

8.2K
28 января 2006 года
TheMaster
32 / / 23.12.2005
Большое спасибо всем за ответы. Это, естественно, будет работать. Только у меня этих компонентов, которые TEdit, на форме не один, а пять или шесть, не помню. Да и на других формах есть. И вааще, хоцца сделать так, чтобы их можно было переменное количество. (Не, ГЗМ, в смысле, губозакаточная машинка - великая весчь, однако! Тока мне с удвоенной производительностью надо. Два Пэ которая :-)
Чего мне в SpinEdit'е понравилось - это что в нём не надо писать НИ ОДНОЙ строчки кода, чтобы как-нибудь обработать исключение. Он сам разбирается, что в строчке - не число, и сбрасывает его в единицу. Мне надо, чтобы он не просто сбрасывал в единицу, а ещё и пользователя предупреждал (фокус ввода возвращал и так далее). Причём писать обработчик для КАЖДОГО компонента я не хочу. Максимум - один на форму.

Совсем мелочи остались, однако. Понять, что происходит с компонентом, когда он ТЕРЯЕТ фокус ввода. Какое там событие, или ещё чего в этом духе? Как на него отреагировать?

Буду весьма благодарен, если мне кто-нибудь подскажет. Ссылочкой там, или намёком. А пока - ковыряемся, разбираемся. Как пойму - напишу.
1
28 января 2006 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by TheMaster
Большое спасибо всем за ответы. Это, естественно, будет работать. Только у меня этих компонентов, которые TEdit, на форме не один, а пять или шесть, не помню. Да и на других формах есть.


Создай для всех своих компонентов единый обработчик - и вперед - в чем проблема то? Если же тебе хотелось бы создать с поведением SpinEdit - то разумнее при этом не генерировать исключение а проверять нажатую клавишу и состояние допклавиш типа шифта и т.п. - это гораздо более корректно. Перехват исключения в компоненте - ИМХО не самое корректное решение, потому как зачастую разумней оставить это на программиста который использует компонент - потому что ошибки связанные с неверным преобразованием делением на ноль и т.п. достаточно критичны для программы и лучше если разработчик приймет решение самостоятельно, что должно при этом происходить - но правда если компонент пишется для конкретной задачи - правда тогда смысл в данном компоненте?

Цитата:
Originally posted by TheMaster

Совсем мелочи остались, однако. Понять, что происходит с компонентом, когда он ТЕРЯЕТ фокус ввода. Какое там событие, или ещё чего в этом духе? Как на него отреагировать?

Буду весьма благодарен, если мне кто-нибудь подскажет. Ссылочкой там, или намёком. А пока - ковыряемся, разбираемся. Как пойму - напишу.


Ну так есть события OnEnter & OnExit - в чем собственно проблема?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог