Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Try... catch...  (Прочитано 18741 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Tuborg
Команда клуба

ee
Offline Offline

« : 19-02-2008 09:53 » 

При открывании ком-порта пытаюсь отловить его доступность при помощи try... catch
Если требуемый ком-порт отсутствует, то хочу появления сообщения типа "Порт № не может быть открыт"
Но вместо этого мне всегда вываливается сообщение: "не достаточно системных ресурсов"

В чём глюк?

Код:
  CString sPort;
  sPort.Format(_T("\\\\.\\COM%d"), nPort);
  try {
m_hComm = CreateFile(sPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, bOverlapped ? FILE_FLAG_OVERLAPPED : 0, NULL);
  }
  catch (char *err_str){
    CString str;
str.Format(_T("Порт %d не может быть открыт: %s"), nPort, err_str);
::AfxMessageBox(str);
  }

Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 19-02-2008 10:05 » 

и не получится, катч тут ни при чём. Надо проверять валидность вернутого хендла m_hComm -
!= 0 и !=(HANDLE)-1
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 19-02-2008 10:08 » 

а насчёт недостаточности системных ресов - это что то другое, например бесконечный цикл, создающий какой то объект винды
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 19-02-2008 10:44 » 

Ещё лучше проверять
if (hFile == INVALID_HANDLE_VALUE)


Tuborg, а в самом деле откуда идея "try-catch" использовать, да ещё с catch (char *err_str)?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 19-02-2008 10:47 » 

Джон, ну, я и мимею в виду INVALID_HANDLE_VALUE (==-1)
, только никогда не могу запомнить, что какая функция возвращает - 0 или -1, поэтому проверяю оба значения ))
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 19-02-2008 13:49 » 

Лёш, поэтому (аки по ещё ряду причин) лучше пользоваться константами.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Aveic
Постоялец

ru
Offline Offline
Пол: Мужской
Yellow


« Ответ #6 : 19-02-2008 15:11 » 

Tuborg, а в самом деле откуда идея "try-catch" использовать, да ещё с catch (char *err_str)?

Мне тоже интересно, что может сподвигнуть на такое?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 19-02-2008 15:17 » 

Джон, так ведь я про что говорю - иногда это действительно INVALID_HANDLE_VALUE , а иногда 0  , примеры не вспомню
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 19-02-2008 15:18 » 

Aveic, да ничего фантастического - человек первый раз пользуется функцией и не знает свойств, вот и подумал, что функция , возможно, исключения выбрасывает. Ничего криминального )
Записан

Tuborg
Команда клуба

ee
Offline Offline

« Ответ #9 : 19-02-2008 22:18 » 

НЕЕЕТ... СТОП... санта-барбару развели тут понимаешь =)
есть ноутбук, куда я ком-порт подключаю из вне по ethernet (не важно как... обычный ремапинг).... так вот если ремап не срабатывает (например езернетовский кабуль вынут из сетевухи), то функция CreateFile создаёт диалоговое окошко о нехватке системных ресурсов! другое дело, если ремапинг отключён вообще, то диалогового сообщения о нехватке ресурсов не возникает и createfile действительно возвращает инвалид_хэндл!

а конструкция catch (char *err_str) взята из МСДН. который говорит что сообщение об ошибке в таком случае (указатель на сообщение) помещяется как раз в этот параметр.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #10 : 20-02-2008 01:42 » 

Tuborg, если даже API функция и вызывает исключение ( например HeapCreate), то не исключения C++ (try catch), а SEH (__try __except). Если можно, покажи, где в MSDN есть такой пример. Может я ошибаюсь, но CreateFile не вызывает исключений, во всяком случае документированных.
« Последнее редактирование: 20-02-2008 01:47 от sss » Записан

while (8==8)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 20-02-2008 04:21 » 

а покажи цитату из мсдн Улыбаюсь
Записан

Tuborg
Команда клуба

ee
Offline Offline

« Ответ #12 : 20-02-2008 09:37 » 

Код:
int main()
{
    cout << "In main." << endl;
    try
    {
        cout << "In try block, calling MyFunc()." << endl;
        MyFunc();
    }
    catch( CTest E )
    {
        cout << "In catch handler." << endl;
        cout << "Caught CTest exception type: ";
        cout << E.ShowReason() << endl;
    }
    catch( char *str )
    {
        cout << "Caught some other exception: " << str << endl;
    }
    cout << "Back in main. Execution resumes here." << endl;
    return 0;
}
« Последнее редактирование: 09-04-2008 20:20 от Вад » Записан
Tuborg
Команда клуба

ee
Offline Offline

« Ответ #13 : 20-02-2008 09:37 » 

раздел try-catch exception handling, examples
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 20-02-2008 10:29 » 

а теперь покажи реализацию MyFunc(); Улыбаюсь
Записан

Tuborg
Команда клуба

ee
Offline Offline

« Ответ #15 : 20-02-2008 11:07 » 

при чём здесь MyFunc ?
речь же ведём про catch( char *str )
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 20-02-2008 11:09 » 

ну так не видно же, что происходит в функции - кто там кидает эксепшен
Записан

Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 20-02-2008 11:54 » 

Воистину, тип генерируемого исключения определяется тем, кто его генерит. Совершенно не обязательно это строка - некоторые рекомендуют, например, от std::exception все типы генерируемых исключений наследовать.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #18 : 20-02-2008 12:20 » 

Tuborg, тебе спрашивают не почему ты массив символов ловишь, а почему ты его ловишь при вызове CreateFile?

Обычно инфа стоит в MSDN. Например для объекта CInternetSession в MSDN стоит

Цитата
If no Internet connection can be opened, CInternetSession throws an AfxThrowInternetException.

Отсюда я знаю, что должет ловить catch(AfxThrowInternetException ex)

А вот с чего ты решил ловить char *str при вызове CreateFile?


ps Если ты знаешь что исключение вызывается, но не знаешь его тип. Попробуй сначала отловить все исключения

catch(...)
« Последнее редактирование: 20-02-2008 12:35 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Tuborg
Команда клуба

ee
Offline Offline

« Ответ #19 : 20-02-2008 12:34 » new

ага понял, спасибо
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines