powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Обработка исключений отсутствует
25 сообщений из 97, страница 3 из 4
Обработка исключений отсутствует
    #38392900
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Так ошибся получается не тот, кто создал джаву, а тот кто на нее перешел с С :)
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392902
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гослинг штоли?
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392904
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton )
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38392917
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я с сей не ушёл.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393014
Anatoly MoskovskyMasterZiv,

У гугловцев есть возможность закидать всех шапками (реализовать все необходимые им библиотеки самим).
Так что может и отключают.
Обычные разработчики - не могут себе это позволить.
Кстати, интересно какой компилятор в Google обычно используют, или тоже пишут свой? :)
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393021
?любой код возвратаА с-программист обязан учитывать, что любая функция может выкинуть абсолютно любой код возврата, который непонятно как обрабатыватьНо только это не влияет на ход выполнения вашего кода. А с исключениями надо всегда учитывать, что следующая после вызова функции строка кода может и не выполниться.
Абсолютно везде, где в коде с кодом возврата идет return, в коде с исключениями идет throw(), и наоборот, и следующая строчка не выполнится после любого из них. В любом случае необходимо сначала обработать ошибку.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393028
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я глубоко убежден что я не использую исключения именно потому что понимаю их :) Концепция простая, но излишне подверженная кривому кодированию.

Это что вот значит?
Ведь так можно по все, что угодно сказать. Циклы — концепция простая, но излишне подвержена кривому кодированию. Классы — ... Но подвержена излише кривому кодированию.

Вон, Торвальдс так про весь С++ говорит.

Есть языки где без исключений жить нельзя вообще (почти все функциональные например), но в С++ можно прекрасно жить без исключений.

Чем с++ принципиально от них отличается? Чем тебе с++ не функциональный язык?
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393075
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivА я глубоко убежден что я не использую исключения именно потому что понимаю их :) Концепция простая, но излишне подверженная кривому кодированию.

Это что вот значит?
Ведь так можно по все, что угодно сказать. Циклы — концепция простая, но излишне подвержена кривому кодированию. Классы — ... Но подвержена излише кривому кодированию.

Вон, Торвальдс так про весь С++ говорит.И я с ним согласен, поэтому предпочитаю простой C :)

MasterZivЕсть языки где без исключений жить нельзя вообще (почти все функциональные например), но в С++ можно прекрасно жить без исключений.

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

Вообще, С++ мне напоминает классическую настольную D&D - можно отыгрывать любого персонажа в меру своей фантазии. Но хорошей игра будет только в том случае если ее ведет хороший dungeon master. Так же и с С++ - можно писать в любом стиле, но хороший проект получится только если есть жесткий лидер группы способный вести проект. И если лидер сказал: "выход из комнаты только на восток", то писать надо именно так - иначе game over и ищи новую работу.
В других языках как-то больше порядка. Есть базовая парадигма, есть стандартный стиль оформления, все учебники следуют общим принципам... И только в С++ что ни учебник, то своя колокольня, что ни библиотека, то свой монастырь.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393084
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
MasterZivЭто не так. Если например не выделилась память, а ты это не проверил через какой-то код возврата
(да хоть тот же malloc на NULL), то первый же код, который эту память будет использовать, упадёт.
Такие же случаи могут быть и с другими видами объектов и функциями.Это просто прекрасно, что сразу упадет. Гораздо хуже, когда внешне прекрасно все работает, но иногда выдает совершенно левые результаты.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393088
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
любой код возвратаАбсолютно везде, где в коде с кодом возврата идет return, в коде с исключениями идет throw(), и наоборот, и следующая строчка не выполнится после любого из них. В любом случае необходимо сначала обработать ошибку.В вызывающем эту функцию коде не выполнится следующая строка, если функция выкинула исключение.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393419
?любой код возвратаАбсолютно везде, где в коде с кодом возврата идет return, в коде с исключениями идет throw(), и наоборот, и следующая строчка не выполнится после любого из них. В любом случае необходимо сначала обработать ошибку.В вызывающем эту функцию коде не выполнится следующая строка, если функция выкинула исключение.
В вызывающем эту функцию коде обязательно надо проверить её код возврата, и если он содержит ошибку, то следующая строка не выполнится, т.к. обязательно делаем break, return, exit...
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393522
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393551
? http://www.transl-gunsmoker.ru/2010/02/blog-post_11.html
автор(Да, есть модели программирования типа RAII и транзакций, но вы редко сможете увидеть пример, который бы их использовал)
Супер!
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393569
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
любой код возврата, ок, возьмите пример из оригинального сообщения
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
BOOL ComputeChecksum(LPCTSTR pszFile, DWORD* pdwResult)
{
  HANDLE h = CreateFile(pszFile, GENERIC_READ, FILE_SHARE_READ,
       NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  HANDLE hfm = CreateFileMapping(h, NULL, PAGE_READ, 0, 0, NULL);
  void *pv = MapViewOfFile(hfm, FILE_MAP_READ, 0, 0, 0);
  DWORD dwHeaderSum;
  CheckSumMappedFile(pvBase, GetFileSize(h, NULL),
           &dwHeaderSum, pdwResult);
  UnmapViewOfFile(pv);
  CloseHandle(hfm);
  CloseHandle(h);
  return TRUE;
}


теперь представьте, что функции вместо возврата кода ошибки кидают исключения и исправьте код :)
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393582
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, парни очень правильно рассуждают, но потом в самом-самом конце почему-то делают ровно противоположные к правильным выводы.

Ну, на самом деле конечно же ни один из выводов "я буду использовать исключения" или "я не буду использовать исключения"
не правильный или неправильный, это скорее вопрос идеологии.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393613
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?любой код возврата, ок, возьмите пример из оригинального сообщения
теперь представьте, что функции вместо возврата кода ошибки кидают исключения и исправьте код :)
Пишется обертка над HANDLE которая
1) если хендл инвалидный кидает исключение при попытке его прочесть (operator HANDLE())
2) если хендл валидный закрывает его в дестукторе.

Итого код останется точно таким же. :)
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393616
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyИтого код останется точно таким же. :)
Даже сократится за счет ненужности CloseHandle :)
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393632
?любой код возврата, ок, возьмите пример из оригинального сообщения
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
BOOL ComputeChecksum(LPCTSTR pszFile, DWORD* pdwResult)
{
  HANDLE h = CreateFile(pszFile, GENERIC_READ, FILE_SHARE_READ,
       NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  HANDLE hfm = CreateFileMapping(h, NULL, PAGE_READ, 0, 0, NULL);
  void *pv = MapViewOfFile(hfm, FILE_MAP_READ, 0, 0, 0);
  DWORD dwHeaderSum;
  CheckSumMappedFile(pvBase, GetFileSize(h, NULL),
           &dwHeaderSum, pdwResult);
  UnmapViewOfFile(pv);
  CloseHandle(hfm);
  CloseHandle(h);
  return TRUE;
}


теперь представьте, что функции вместо возврата кода ошибки кидают исключения и исправьте код :)
Во-первых эти функции не могут кидать исключения, т.к. это код на C, или по крайней мере в C-style, а не C++.
Во-вторых этот код не верный, т.к. всегда возвращает true!


И не смотря на то, что WinAPI писался для совместимости с C, на RAII и exceptions он в 100 раз более понятный и отлаживаемый - тут уже никак не перепутаешь и не забудешь вызовы CloseHandle/UnmapViewOfFile. В нормальном C++ коде все функции либо уже возвращали бы smart pointers с нужными делитерами, либо вообще все скрывали в конструкторе, как в std::fstream.

Теперь приведите этот же код с кодами возврата:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
BOOL ComputeChecksum(LPCTSTR pszFile, DWORD* pdwResult)
{
  try {
    typedef std::remove_pointer<HANDLE>::type HANDLE_VAL;

    std::unique_ptr<HANDLE_VAL> h (CreateFile(pszFile, GENERIC_READ, FILE_SHARE_READ,
         NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL), 
      [](HANDLE val) { CloseHandle(val); } );

    std::unique_ptr<HANDLE_VAL> hfm (CreateFileMapping(h.get(), NULL, PAGE_READ, 0, 0, NULL),
      [](HANDLE val) { CloseHandle(val); } );

    std::unique_ptr<void> pv (MapViewOfFile(hfm.get(), FILE_MAP_READ, 0, 0, 0), 
      [](void *val) { UnmapViewOfFile(val); } );

    DWORD dwHeaderSum;
    CheckSumMappedFile(pvBase, GetFileSize(h, NULL), &dwHeaderSum, pdwResult);

  } catch(...) {
    return false;
  }
  return true;
}
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393637
Anatoly Moskovsky?любой код возврата, ок, возьмите пример из оригинального сообщения
теперь представьте, что функции вместо возврата кода ошибки кидают исключения и исправьте код :)
Пишется обертка над HANDLE которая
1) если хендл инвалидный кидает исключение при попытке его прочесть (operator HANDLE())
2) если хендл валидный закрывает его в дестукторе.

Итого код останется точно таким же. :)
1 даже не нужно, т.к. по его условию "функции вместо возврата кода ошибки кидают исключения" :)
Но в Ture C++-Style библиотеке это вообще все не нужно, т.к. реализовано и сокрыто в библиотеке.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393655
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в Ture C++-Style библиотеке,

Ну все же в вашем коде много синтаксического мусора.
То что я предложил, оставляет код буквально таким же как привыкли си-шники, но при этом автоматически возникает обработка ошибок.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393665
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?любой код возврата, ок, возьмите пример из оригинального сообщения
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
BOOL ComputeChecksum(LPCTSTR pszFile, DWORD* pdwResult)
{
  HANDLE h = CreateFile(pszFile, GENERIC_READ, FILE_SHARE_READ,
       NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  HANDLE hfm = CreateFileMapping(h, NULL, PAGE_READ, 0, 0, NULL);
  void *pv = MapViewOfFile(hfm, FILE_MAP_READ, 0, 0, 0);
  DWORD dwHeaderSum;
  CheckSumMappedFile(pvBase, GetFileSize(h, NULL),
           &dwHeaderSum, pdwResult);
  UnmapViewOfFile(pv);
  CloseHandle(hfm);
  CloseHandle(h);
  return TRUE;
}


теперь представьте, что функции вместо возврата кода ошибки кидают исключения и исправьте код :)

Ну, в этом нет ничего сложного. Только необходимо провести подготовительную работу:
- реализовать handle_guard
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
	template<typename T, typename F>
	class handle_guard : noncopyable
	{
		T handle;
		F destructor;
		T invalid_handle;
	public:
		handle_guard(T handle, F destructor, T invalid_handle) : handle(handle), destructor(destructor), invalid_handle(invalid_handle)
		{
		}
		~handle_guard()
		{
			if( handle != invalid_handle )
				destructor(handle);
		}
		T release() {
			T tmp = handle;
			handle = invalid_handle;
			return tmp;
		}
		void reset(T handle) {
			if( this->handle != invalid_handle )
				destructor(this->handle);
			this->handle = handle;
		}
	public:
		operator T() const
		{
			return handle;
		}
	}; // class handle_guard..


- обрамить winapi вызовы

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
    //////////////////////////////////////////////////////////////////////////
    // Константы
    //

    const HANDLE INVALID_HANDLE = NULL;
    const HMODULE INVALIDE_MODULE = NULL;
    const FARPROC INVALIDE_FARPROC = NULL;

    //////////////////////////////////////////////////////////////////////////
    // Типы
    //

    // тип для хранения переменных типа HANDLE
    typedef handle_guard<HANDLE, BOOL (WINAPI*)(HANDLE)> HandleGuard;
    // тип для хранения переменных типа HLOCAL
    typedef handle_guard<HLOCAL, HLOCAL (WINAPI*)(HLOCAL)> LocalMemoryGuard;
    // тип для хранения переменных типа HANDLE
    typedef handle_guard<HMODULE, BOOL (WINAPI*)(HMODULE)> ModuleGuard;

    //////////////////////////////////////////////////////////////////////////
    //  Исключение
    //
    class WinApiException : public std::runtime_error
    {
        // категория (домен) ошибки (сетевая, к примеру, или ошибка базы данных) 
        // определяется приложением
        WORD m_category;

    public:
        explicit WinApiException(const std::string& m, WORD category = 0)
            : std::runtime_error(m), m_category(category)
        {
        }

        explicit WinApiException(const char *m, WORD category = 0)
            : std::runtime_error(m), m_category(category)
        {
        }

        WORD Category() const {
            return m_category;
        }
    }; // class ExecuteException..

    //////////////////////////////////////////////////////////////////////////
    // Утилиты
    // 

    // вернуть объект исключения соответствующий заданному коду ошибки dw
    inline WinApiException GenerateException(WORD category, const std::string& operation, DWORD dw = GetLastError()) {
        HLOCAL lpMsgBuf = 0;
        FormatMessage(
            FORMAT_MESSAGE_ALLOCATE_BUFFER | 
            FORMAT_MESSAGE_FROM_SYSTEM |
            FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL,
            dw,
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
            (LPTSTR) &lpMsgBuf,
            0, NULL );
        LocalMemoryGuard msgGuard(lpMsgBuf, LocalFree, 0); 
        std::string msg(operation);
        if( !msg.empty() ) 
            msg += ": ";
        if( lpMsgBuf )
            msg += reinterpret_cast<const char*>(lpMsgBuf);
        else
            msg += "failed";
        return WinApiException(msg, category);
    }

    // проверить результат вызова WINAPI функции (result) на успех (successResult) и в случае ошибки
    // выбросить исключение в зависимости от значения resultAsWinError
    template<typename T> T CheckSuccess(WORD category, const std::string& operation, T result, T successResult, BOOL resultAsWinError = FALSE) {
        if( result != successResult ) {
            throw GenerateException(category, operation, resultAsWinError ? result : GetLastError());
        }
        return result;
    }

    // проверить результат вызова WINAPI функции (result) на неуспех (failureResult) и в случае ошибки
    // выбросить исключение
    template<typename T> T CheckFailure(WORD category, const std::string& operation, T result, T failureResult) {
        if( result == failureResult ) {
            throw GenerateException(category, operation, GetLastError());
        }
        return result;
    }



Ну а дальше собственно переписать код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
BOOL ComputeChecksum(LPCTSTR pszFile, DWORD* pdwResult)
{
  HandleGuard h(
        CheckFailure(0, 
                          "CreateFile", 
                           CreateFile(pszFile, GENERIC_READ, FILE_SHARE_READ,
                                          NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL),
                           INVALID_HANDLE),
        CloseHandle,
        INVALID_HANDLE
  );

  HandleGuard hfm (
        CheckFailure(0, 
                          "CreateFileMapping", 
                           CreateFileMapping(h, NULL, PAGE_READ, 0, 0, NULL),
                           INVALID_HANDLE),
        CloseHandle,
        INVALID_HANDLE
  );
  handle_guard<LPVOID, BOOL (WINAPI*)(LPCVOID)> pv(
        CheckFailure(0, 
                          "MapViewOfFile", 
                           MapViewOfFile(hfm, FILE_MAP_READ, 0, 0, 0),
                           0),
        UnmapViewOfFile,
        0
  );
  DWORD dwHeaderSum;
  CheckSumMappedFile(pvBase, GetFileSize(h, NULL),
           &dwHeaderSum, pdwResult);
  return TRUE;
}
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393667
Anatoly Moskovskyв Ture C++-Style библиотеке,

Ну все же в вашем коде много синтаксического мусора.
То что я предложил, оставляет код буквально таким же как привыкли си-шники, но при этом автоматически возникает обработка ошибок.
Ну обертка над HANDLE могла бы в сумме занять чуть больше места, чем исходный код в рамках данного примера, а сторонник кодов возврата бы этого не понял :)
Ну и для UnmapViewOfFile() пришлось бы все равно либо отдельную обертку делать, либо как у меня писать.
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393678
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в Ture C++-Style библиотеке,

Ну естественно суммарный код будет больше, т.к. это должна быть отдельная библиотека, в которой все нужные фичи обернуты в безопасную форму.
А если люди не понимают разницу между прикладным и библиотечным кодом, то им доказывать что либо бессмысленно :)
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393687
В принципе можно ещё так упростить :)

Код: plaintext
1.
2.
3.
4.
5.
// In lib:
typedef std::remove_pointer<HANDLE>::type HANDLE_VAL;
std::unique_ptr<HANDLE_VAL> get_handle(HANDLE val) { 
 return std::unique_ptr<HANDLE_VAL>(val, [](HANDLE val) { CloseHandle(val); } ); 
}


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
BOOL ComputeChecksum(LPCTSTR pszFile, DWORD* pdwResult)
{
  try {
    auto h =get_handle(CreateFile(pszFile, GENERIC_READ, FILE_SHARE_READ,
         NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL));

    auto hfm = get_handle(CreateFileMapping(h.get(), NULL, PAGE_READ, 0, 0, NULL));

    std::unique_ptr<void> pv (MapViewOfFile(hfm.get(), FILE_MAP_READ, 0, 0, 0), 
      [](void *val) { UnmapViewOfFile(val); } );

    DWORD dwHeaderSum;
    CheckSumMappedFile(pvBase, GetFileSize(h.get(), NULL), &dwHeaderSum, pdwResult);

  } catch(...) {
    return false;
  }
  return true;
}
...
Рейтинг: 0 / 0
Обработка исключений отсутствует
    #38393699
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно ещё так упроститьВ принципе можно ещё так упростить :)


Показательный пример мощи современного С++. Спасибо. Отличный пример. Мой же пример "дореволюционного подхода" явно многословен, хотя успешно позволял нам писать во времена VC6. Да, прогресс не остановить.
...
Рейтинг: 0 / 0
25 сообщений из 97, страница 3 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / Обработка исключений отсутствует
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]