какой код лучше, с TRY-CATCH или без?

Тема в разделе "WASM.BEGINNERS", создана пользователем verelex, 3 ноя 2009.

  1. verelex

    verelex New Member

    Публикаций:
    0
    Регистрация:
    15 ноя 2006
    Сообщения:
    90
    как лучше писать
    Код (Text):
    1. void Cpwd1Dlg::LoadFromFile()
    2. {
    3.     CFile file;
    4.     CFileException fex;
    5.     if(!file.Open(L"data.dat",CFile::modeRead|CFile::shareDenyWrite, &fex))
    6.     {
    7.         PTCHAR szError = new TCHAR[1024];
    8.         if(szError)
    9.         {
    10.             fex.GetErrorMessage(szError, 1024);
    11.             MessageBox(szError,L"Couldn't open file <data.dat>");
    12.             delete szError;
    13.         }
    14.     }
    15.     else
    16.     {
    17.         ULONGLONG FileSize = file.GetLength();
    18.         DWORD dwRead;
    19.         BYTE buffer = new BYTE[FileSize];
    20.         if(buffer)
    21.         {
    22.             dwRead = file.Read(buffer, FileSize);
    23.             delete buffer;
    24.         }
    25.         file.Close();
    26.     }
    27. }
    или
    Код (Text):
    1. void Cpwd1Dlg::LoadFromFile()
    2. {
    3.     CFile file;
    4.     CFileException fex;
    5.  
    6.     TRY
    7.     {
    8.         file.Open(L"data.dat",CFile::modeRead|CFile::shareDenyWrite, &fex))
    9.         ULONGLONG FileSize = file.GetLength();
    10.         DWORD dwRead;
    11.         BYTE buffer = new BYTE[FileSize];
    12.         dwRead = file.Read(buffer, FileSize);
    13.         delete buffer;
    14.     }
    15.     CATCH(CFileException, fex)
    16.     {
    17.         fex->ReportError();
    18.     }
    19.     AND_CATCH(CMemoryException, fex)
    20.     {
    21.         //cleanup?
    22.         fex->ReportError();
    23.         //AfxAbort();
    24.     }
    25.     END_CATCH
    26.  
    27.     if(File) file->Close();
    28. }
    ?
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    быстрее - без, лучше - без, короче - возможно с
     
  3. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    max7C4
    чем?
     
  4. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    +1
     
  5. reversecode

    reversecode Guest

    Публикаций:
    0
    без разницы
     
  6. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    deLight
    экзепшн по сравнению с if выполняется ну ооооооооооооооооооочень долго. хотя нет. мало о.
     
  7. Stariy

    Stariy Member

    Публикаций:
    0
    Регистрация:
    22 окт 2003
    Сообщения:
    529
    Адрес:
    Russia
    Первое наглядно и понятно, а второе - ересь.
     
  8. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    самый офигенный стиль программенга - раскидать try catch throw по всем модулям проги, реально по всей проге... чтоб когда встречаешь хоть один - надо было перерывать весь проект, чтоб узнать де оно генерецо/ловецо
     
  9. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Freeman
    +1
     
  10. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    Stariy
    с try-catch все разделено и смотрится как раз лучше имхо, не перемешивается код с обработкой ошибок
    если в меру, и экзепшены не сыпятся слишком часто - то почему бы нет )
     
  11. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    и главное можно обработать ошибку как хочется не меняя функцию :derisive:
     
  12. Quatre_R_Winner

    Quatre_R_Winner Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    66
    Правильнее всего было бы совместить обо варианта. Точнее первый вариант заключить в блок try. Вообще исключения нужны для отлова исключений, а не для отлова ошибок. Если что то можно проверить логикой, то это надо проверять логикой. Но и про исключения тоже забывать нельзя. Проверка исключений упасёт от падения проги и потери всех данных в случае действительно непредвиденных обстоятельств. К примеру от повреждения памяти процесса (оператива глючит или вирус забрался).
     
  13. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    В жизни мы, как правило, запоминаем че делать в случае жопы, но живем и не паримся. Когда у нас настает жопа, мы вспоминаем че-надо делать в этой жопе ) Откидываем ситуацию, что иногда приходится и думать )))
    Вот и в исключениях, ты пишешь код, как будто он без ошибок будет выполняться, но прописываешь "че делать если жопа?", так у тебя :
    1) обработка багов не размазывается по коду, ты четко шаришь где искать обработку и не забыл ли я чего ?!
    2) код читается проще, ты можешь быстрее написать действия "по шагам", не отвлекаясь на обработку багов

    Мне думается этот подход куда лучше ;)
     
  14. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Превый вариант не рабочий. new может бросить исключение которе никто не перехватит.
     
  15. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Проверка условия занимает время.
     
  16. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    J0E
    а так вы провалитесь в ядро что будет гораздо дольше полу миллиона if'ов, которые, между прочим, при правильной реализации, отпадут еще на стадии декодирования длин инструкций из-за системы предсказания переходов, но эта правильная реализация вам скорее всего по виду не понравится т.к. это что-то типа if (){if() {...}else{break}}else{break}
     
  17. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Диспетчер в ядре будет вызван тока в _исключительных_ ситуациях.
     
  18. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    J0E
    +1
    я вообще удивляюсь, о чем может быть речь в этой теме, имея лишь один , по крайней мере, валидный вариант.
     
  19. reversecode

    reversecode Guest

    Публикаций:
    0
    J0E
    какое исключение нужно еще что памяти нету?
    одним условием проверяеться
    Код (Text):
    1. PTCHAR szError = new TCHAR[1024];
    2.         if(szError)
     
  20. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    любое.
    даже стандартное new (а не своя реализация) может потенциально кидать разные эксепшены.
    Хотя бы например то, что запрашиваем невыровненный блок данных (на некоторых системах это нельзя делать).