Почему не работает перехватчик исключений?
a = 10;
b = 0;
c = a/b;
Типа, генерю какое-то исключение.
Ладно, дальше добавляю обработчик этих исключений:
в заголовочном файле:
в основном файле:
{
Application->MessageBox("Упс... Ошибочка вышла","Чего-то непонятное", NULL);
}
Дальше надо этот обработчик подключить и по окончанию работы не забыть отключить. В общем, создаю два обработчика сообщений на форме - OnActivate и OnDeactivate, дописываю в первый:
Во второй:
Ну, в общем, дальше компилю, запускаю, появляется форма с кнопкой, я эту кнопку нажимаю, появляются нужные сообщения и всё в этом роде - короче, всё работает, как надо.
Дальше я открываю проект, с которым работаю. Прога посложнее, несколько файликов, три или четыре модальные формы и так далее. Короче, делаю абсолютно то же самое - и ни хрена, появляется сообщение о делении на нуль, по-английски, ессно, на мой обработчик прога - ноль внимания. Справка добросовестно повторяет слова умных книжек. Может, кто-нибудь скажет мне по этому поводу что-нибудь новенькое, чего я ещё не знаю?
try{
..kode..
}catch(...){ что делать..};
А то что ты юзаешь я как то попробывал,мне не понравилось.
Не, если интересно - могу поделиться файлами...
Огород я затеял городить, чтобы решить простейшую проблему: .... Короче, сейчас я пишу новый компонент на основе строчки TEdit, который будет работать так, как мне нравится.
Не, если интересно - могу поделиться файлами...
Да уж. Рекомендовал бы попытаться оформить патент на двухколесное средство передвижения при помощи педалей. :)
Если у него это не получается, генерится исключение EConvertError, и строчка в окошке заменяется на ноль. Вот это-то исключение я и хотел перехватить. Однако через Try...Catch это сделать в принципе невозможно. ....
Могу в принципе поделится файлами в которых в принципе перехватывается исключение, которое в принципе для некоторых в принципе программистов в принципе не перехватываемо. В приципе хелп желательно читать.
И желательно до того как писать в форумы.
А нельзя ли поподробнее: какой именно раздел справки описывает перехват таких исключений? Я, конечно, не берусь утверждать, что прочитал всё, посвящённое классу Exception, но в том, что я просматривал, ответа так и не нашлось. Умные книжки рекомендуют два способа: один я описал выше, другой - через try...catch. Может, я что-то не знаю по поводу того, как применять один из них?
Может мы просто не можем друг друга понять? Вот код:
{
try{
int i = StrToInt(Edit1->Text);
ShowMessage("Это число");
}
catch(...){
ShowMessage("нет Это не число");
Edit1->Text = "0";
}
}
Это работает и работает нормально. Можно указать конкретное исключение которое будет перехватывать этот обработчик. В чем собственно проблема? А обработчик приложения просто не успевает перехвать исключение - его обработает библиотека, если не захотел это сделать программист. Перехватывать подобные исключения в компоненте - достаточно серьезная ошибка.
Кстати, если добавить этот код вот таким:
{
try{
int i = StrToInt(Edit1->Text);
ShowMessage("Это число");
int g = i/0;
}
catch(...){
ShowMessage("нет Это не число");
Edit1->Text = "0";
}
}
он тоже нормально отработает.
{
try{
int i = StrToInt(Edit1->Text);
ShowMessage("Это число");
int g = i/0;
}
catch(...){
ShowMessage("нет Это не число");
Edit1->Text = "0";
}
}
он тоже нормально отработает.
Только лучше все-таки отлавливать EConvertError &e. Всеядный обработчик - крайняя мера.
Чего мне в SpinEdit'е понравилось - это что в нём не надо писать НИ ОДНОЙ строчки кода, чтобы как-нибудь обработать исключение. Он сам разбирается, что в строчке - не число, и сбрасывает его в единицу. Мне надо, чтобы он не просто сбрасывал в единицу, а ещё и пользователя предупреждал (фокус ввода возвращал и так далее). Причём писать обработчик для КАЖДОГО компонента я не хочу. Максимум - один на форму.
Совсем мелочи остались, однако. Понять, что происходит с компонентом, когда он ТЕРЯЕТ фокус ввода. Какое там событие, или ещё чего в этом духе? Как на него отреагировать?
Буду весьма благодарен, если мне кто-нибудь подскажет. Ссылочкой там, или намёком. А пока - ковыряемся, разбираемся. Как пойму - напишу.
Большое спасибо всем за ответы. Это, естественно, будет работать. Только у меня этих компонентов, которые TEdit, на форме не один, а пять или шесть, не помню. Да и на других формах есть.
Создай для всех своих компонентов единый обработчик - и вперед - в чем проблема то? Если же тебе хотелось бы создать с поведением SpinEdit - то разумнее при этом не генерировать исключение а проверять нажатую клавишу и состояние допклавиш типа шифта и т.п. - это гораздо более корректно. Перехват исключения в компоненте - ИМХО не самое корректное решение, потому как зачастую разумней оставить это на программиста который использует компонент - потому что ошибки связанные с неверным преобразованием делением на ноль и т.п. достаточно критичны для программы и лучше если разработчик приймет решение самостоятельно, что должно при этом происходить - но правда если компонент пишется для конкретной задачи - правда тогда смысл в данном компоненте?
Совсем мелочи остались, однако. Понять, что происходит с компонентом, когда он ТЕРЯЕТ фокус ввода. Какое там событие, или ещё чего в этом духе? Как на него отреагировать?
Буду весьма благодарен, если мне кто-нибудь подскажет. Ссылочкой там, или намёком. А пока - ковыряемся, разбираемся. Как пойму - напишу.
Ну так есть события OnEnter & OnExit - в чем собственно проблема?