Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему не срабатывает catch-блок 
V
    Опции темы
livo
Дата 13.8.2010, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 14.10.2007

Репутация: 1
Всего: 1



Доброго времени суток! Пишу код в С++Блдр 6. Следующая функция должна загружать данные из файла с заданным именем. Загрузка производится с использованием TFileStream. Если файла не существует, то функция дожна возвращать false, предварительно перехватив исключение блоком catch(...). Вместо этого получаю сообщение с текстом:

EAccessViolation

Имхо, блок catch(...) перехватывает любые исключения. Почему же здесь этого не происходит.
Код

bool __fastcall TFHotKey::load_list()
{
 TFileStream *fs;
 String fn  = ExtractFilePath(ParamStr(0))+"list.list";
 try
 {
  fs=new TFileStream(fn,fmOpenRead|fmShareExclusive);
  //...
  delete fs;
 } 
 catch(...)
 {   
   return 0;
 }
 return 1;
}

PM MAIL   Вверх
azesmcar
Дата 13.8.2010, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Я давно не работал с builder-ом, потому могу ошибаться.

Если EAccessViolation действительно C++ исключение - то это может быть по причине того, что программа запущена под Debugger-ом, тогда насколько я помню Builder в любом случае показывал сообщение об ошибке, даже если оно ловиться. Еще возможен вариант, что исключение генерируется вне блока try, и еще возможно это не C++ исключение а обычный Access Violation, который ловиться через SEH. 
PM   Вверх
livo
Дата 13.8.2010, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 14.10.2007

Репутация: 1
Всего: 1



Исключение выбрасывается в конструкторе TFileStream. Я запускал проект в среде с включенными опциями:

Tools > Debugger Options... > Language Exceptions:
  • Stop on Delphi Exceptions
  • Stop on C++ Exceptions

и получил сообщение следующего содержания:

Project Project1.exe raised exception class EFOpenError with message 'Cannot open file D:\list.list'. Process stopped. Use Step or Run to continue.

PM MAIL   Вверх
azesmcar
Дата 13.8.2010, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



livo

Ну да, значит так оно и есть, просто дебагер перехватывает, запускай обычно и все должно быть в порядке, или просто убери 
Цитата

    * Stop on Delphi Exceptions
    * Stop on C++ Exceptions

PM   Вверх
livo
Дата 13.8.2010, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 14.10.2007

Репутация: 1
Всего: 1



azesmcar, при выполнении приложения отдельно от среды, появляется сообщение

EAccessViolation

Я включал те опции, чтобы посмотреть что скажет дебаггер билдера. Он перехватывает это исключение. Не пойму, почему мой кэтч-блок, перехватывающий ВСЕ исключения, не перехватывает исключение, возникающее при открытии несуществующего файла.
PM MAIL   Вверх
azesmcar
Дата 13.8.2010, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Цитата(livo @  13.8.2010,  14:15 Найти цитируемый пост)
azesmcar, при выполнении приложения отдельно от среды, появляется сообщение

EAccessViolation

похоже на то, что ошибка в другом месте, т.е. на самом деле try-catch сработал, а где-то в другом участке выдал EAccessViolation.

Цитата(livo @  13.8.2010,  14:15 Найти цитируемый пост)
Я включал те опции, чтобы посмотреть что скажет дебаггер билдера. Он перехватывает это исключение. 

и в чем тогда вопрос? значит все в порядке, ищи ошибку в другом месте. В дебагере пройди дальше (т.е. нажми Run)
Цитата(livo @  13.8.2010,  13:33 Найти цитируемый пост)
Use Step or Run to continue.

и посмотри где еще выдается ошибка.

PM   Вверх
livo
Дата 13.8.2010, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 14.10.2007

Репутация: 1
Всего: 1



azesmcar, действительно, ошибка была на самом видном месте!!!
Код

bool __fastcall TFHotKey::load_list()
{
 TFileStream *fs;//вот она - неинициализированная переменная
 String fn  = ExtractFilePath(ParamStr(0))+"list.list";
 try
 {
  fs=new TFileStream(fn,fmOpenRead|fmShareExclusive);//выброс исключения в конструкторе
  //оператор new не завершает свою работу => fs содержит неизвестную информацию
  //...
  delete fs;
 } 
 catch(...)
 {   
   if(fs)delete fs;//попытка удалить объект по некорректному адресу. Здесь и выбрасывалось  
   //исключение
   return 0;
 }
 return 1;
}

azesmcar, спасибо огромное!
PM MAIL   Вверх
azesmcar
Дата 13.8.2010, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



livo
smile 

Код

TFileStream *fs = 0;
...
delete fs;

проверять при удалении не надо.
Удаление нулевого указателя не является ошибкой, можешь не проверять, delete сам проверяет.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0531 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.