Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
codesurfer
0 / 0 / 0
Регистрация: 09.02.2017
Сообщений: 69
1

Исключения и блоки try/except

07.08.2017, 05:48. Просмотров 831. Ответов 7
Метки нет (Все метки)

Всем привет.

Как известно, есть функции которые:
* возвращают тип void
* не возвращают ошибку через GetLastError()
* при этом, бросают исключения WinAPI.

Я прочитал в постах[1, 2] о том, что блоки типа __try/__except не рекомендуются к использованию.

Тогда вопрос - как контролировать работу функций, которые в случае своей некорректной работы, единственное что сообщают - это исключение?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.08.2017, 05:48
Ответы с готовыми решениями:

Обработка исключения
Здравствуйте, прошу помощи у опытных программистов! :( Пишу библиотеку на...

Try/catch не ловит все исключения
есть код: try { curlpp::Easy myRequest; myRequest.setOpt(new...

Исключения, возвращающие данные из фукнции
исключенеия возвращающие данные из фукнции допустим есть контейнер...

JIT-отладчик или необработанные исключения
Писал код на c++ opengl, запускается нормально, компилится, но после закрытия...

Исключения, генерируемые внутри процедуры диалога
Что-то у меня не перехватываются исключения, которые генерируются внутри...

7
jr_
127 / 128 / 52
Регистрация: 14.06.2016
Сообщений: 449
Завершенные тесты: 5
07.08.2017, 14:01 2
Цитата Сообщение от codesurfer Посмотреть сообщение
при этом, бросают исключения WinAPI
что же это за функции и исключения такие?
Цитата Сообщение от codesurfer Посмотреть сообщение
__try/__except не рекомендуются к использованию
рекомендуются для чего и были созданы - обработки аппаратных исключений.
0
codesurfer
0 / 0 / 0
Регистрация: 09.02.2017
Сообщений: 69
07.08.2017, 17:22  [ТС] 3
Цитата Сообщение от jr_ Посмотреть сообщение
что же это за функции и исключения такие?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <string>
#include <iostream>
#include <windows.h>
 
using namespace std;
 
 
int main() {
    
    SRWLOCK lock;
    InitializeSRWLock(&lock);
 
    __try {
        ReleaseSRWLockShared(&lock);    // void. Вброс исключения, из-за вызова release до acquire.
    }                                   // В MSDN ничего не сказано о том что эта функция бросает исключение.
    __except (EXCEPTION_EXECUTE_HANDLER) {
        cout << "EXCEPTION" << endl;    // обработка исключения.
    }
 
    cin.get();
}
0
DrOffset
8141 / 4722 / 1154
Регистрация: 30.01.2014
Сообщений: 7,692
07.08.2017, 17:50 4
Лучший ответ Сообщение было отмечено Убежденный как решение

Решение

Цитата Сообщение от codesurfer Посмотреть сообщение
Вброс исключения, из-за вызова release до acquire.
Это не исключение, а assert. Он нужен, чтобы предотвратить некорректное написание кода программистом. Тут у тебя assert был пойман обработчиком SEH исключения, но это неверно. Assert для того и нужен, чтобы обрушить программу в месте, где программист нарушил контракт, чтобы у него не было иллюзий о работоспособности программы, чтобы он тут же взял и исправил свою ошибку.
Иными словами, в корректной программе таких ситуаций быть не должно, и их не нужно обрабатывать в логике приложения. Их нужно просто не допускать.
1
jupman
230 / 133 / 19
Регистрация: 10.11.2015
Сообщений: 305
07.08.2017, 18:14 5
Цитата Сообщение от jr_ Посмотреть сообщение
что же это за функции и исключения такие?
Например CloseHandle бросает, если под отладкой (STATUS_INVALID_HANDLE/STATUS_HANDLE_NOT_CLOSABLE) или HeapAlloc (STATUS_NO_MEMORY/STATUS_ACCESS_VIOLATION) если с флагом HEAP_GENERATE_EXCEPTIONS.

Добавлено через 2 минуты
Цитата Сообщение от codesurfer Посмотреть сообщение
Тогда вопрос - как контролировать работу функций, которые в случае своей некорректной работы, единственное что сообщают - это исключение?
А зачем их вообще ловить, пусть программы падает, а далее можно изучить дамп.

Добавлено через 12 минут
codesurfer, просто после таких исключений стабильность снижается (разрушение кучи, захваченные объекты синхронизации etc). Можно к примеру в дедлок уйти если продолжить выполнять код. Лучше дать программе упасть. В общем с умом нужно подходить, в некоторых случаях стоит перехватить.
1
codesurfer
0 / 0 / 0
Регистрация: 09.02.2017
Сообщений: 69
07.08.2017, 18:32  [ТС] 6
Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
Это не исключение, а assert. Он нужен, чтобы предотвратить некорректное написание кода программистом. Тут у тебя assert был пойман обработчиком SEH исключения, но это неверно. Assert для того и нужен, чтобы обрушить программу в месте, где программист нарушил контракт, чтобы у него не было иллюзий о работоспособности программы, чтобы он тут же взял и исправил свою ошибку.
Иными словами, в корректной программе таких ситуаций быть не должно, и их не нужно обрабатывать в логике приложения. Их нужно просто не допускать.
Хорошо, тогда как применить assert для данного примера?
Конструкция типа assert(ReleaseSRWLockShared(&lock)) не компилируется, т.к. ReleaseSRWLockShared возвращает тип void.
0
DrOffset
8141 / 4722 / 1154
Регистрация: 30.01.2014
Сообщений: 7,692
07.08.2017, 18:41 7
Лучший ответ Сообщение было отмечено codesurfer как решение

Решение

codesurfer, его не надо применять, он уже написан заботливыми разработчиками внутри функции ReleaseSRWLockShared. Тебе нужно лишь только не мешать и не пытаться отлавливать то, что должно обрушить программу. Видишь такое падение - меняй свой код, исправляй ситуацию. В данном случае добавлением acquire перед вызвовом release.
0
codesurfer
0 / 0 / 0
Регистрация: 09.02.2017
Сообщений: 69
07.08.2017, 19:21  [ТС] 8
Понятно. Спасибо.
0
07.08.2017, 19:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2017, 19:21

Восстановление типа исключения через ссылку
востановление типа исключения через ссылку не совсем понимаю, что за объект...

Можно ли узнать текст неизвестного исключения, ловимого catch(.) ?
Ну собственно в try catch в самом низу стоит catch(...) на случай неизвестных...

Организация собственного исключения и передача в него исходного исключения
Для обработки исключений при работе с БД я создал собственное исключение: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru