Свой класс exception c++. Создание собственного класса исключений. С++ для начинающих. Урок
HTML-код
- Опубликовано: 16 дек 2017
- Cамый лучший способ сказать "спасибо" - поставить лайк и и поделиться уроком с друзьями. Это очень мотивирует создавать полезные уроки =)
С++ try catch. Обработка исключений С++. try catch что это. Изучение С++ для начинающих. Урок #120
goo.gl/rLBe1i
Генерация исключений с++ пример. throw c++ пример. Изучение С++ для начинающих. Урок #121
goo.gl/gjnFnT
Несколько блоков catch. Обработка исключений С++. Изучение С++ для начинающих. Урок #122
goo.gl/KXgXiV
Если вам нравятся мои уроки, вы хотите поддержать меня и развитие канала, то можете сделать это тут!=)
www.donationalerts.ru/r/simple...
или тут
/ simplecode
Уроки по программированию
Наша группа ВК smplcode
Подписывайтесь на канал / @simplecodeit
*Cамый лучший способ сказать "спасибо" - поставить лайк и и поделиться уроком с друзьями. Это очень мотивирует создавать полезные уроки =)*
вот опять та же ситуация: зачем добавлять к конструктору класса MyException, конструктор класса exception ?
MyException(char*msg, int DataState) : *exception(msg)* ?
Почему нельзя без конструктора базового класса?
@@ketzalkoatl2012, вполне себе можно, никто не заставляет делать именно так. Просто базовый класс 'exception' уже содержит в себе метод 'what()', но можно и свой написать. Это просто один из примеров, реализации могут быть разными.
В 2022 версии надо прописывать const char *msg, для конструктора, куда строку передаем. Иначе ругается.
Спасибо тебе брат, помог!
Спасибо за наводку)
не все герои носят плащи)
ещё удобнее можно принять стрингом, а запустить в конструктор родительского класса через str.cstr()
Тогда придется переписывать what() @@tema2976
спасибо я бы много времени потратил на то как это решить если бы ты не подсказал! Спасибо еще раз
Всем привет. Выражаю огромную благодарность автору проекта, за то, что не бросил этот тяжкий труд на половине пути, как это многие делают, а желание наверное возникало не раз. Работаю в Ubuntu 20.04.3 LTS, среда разработки - Sublime Text. Код из урока не работает в моей системе. У кого та же проблема, смотрите код ниже. Точно не знаю, на сколько это правильно, но это работает.
Это часть кода, где есть отличия, остальное без изменений. (первая половина урока).
class MyException : public runtime_error
{
public:
MyException(const char * msg) : runtime_error(msg) { }
private:
};
void func(int value)
{
if(value < 0)
{
throw runtime_error("Число меньше 0.");
}
У меня тоже не хотел компилироваться, но как ты думаешь, в чем была проблема?
Просто потому, что нужно было поставить const в конструкторе класса: MyException(const char* message). Без константы пишет что отсутствуют экземпляры класса.
спасибо, сергей! ваши уроки актуальны даже в 2023 году! ранний опыт других яп даёт о себе знать, он очень помогает. раньше не понимал ООП вообще, и считал что для меня ООП тем более на С++ это смерть, но ваши уроки мне помогли. Большая часть курса - просмотрена, ещё немного)
и как сейчас
@@1mpalo362 практически досмотрел этот курс ещё пол года назад, написал несколько своих програм на qt c++. Но началась учёба и программировать времени не очень осталось т.к. нужно готовиться к экзамен. Но курс - отличный, лучший из тех, что я встречал на ютубе
@@dimakovalskij3350 спасибо за информацию
Начитался кучи инфы на эту тему в инете, решил закрепить вашим видео, не пожалел, очень круто, спасибо автору!))
Спасибо огромное за простое объяснение такой сложной темы!
Отлично объясняешь , просто пять баллов! спасибо!
все так просто, а преподы преподносят так будто "Шатл" в космос запускают)
Pluto ажзвщвсщазза
Вам хоть дают)) мы статические массивы 2 семестра гоняем))
Спасибо за урок.
Спасибо за бесценный труд!)
#обработкаисключений #cвойклассexception #SimpleCode #урокипрограммирования
спасибо!
спасибо за урок!
Спасибо за урок!
Спасибо!!!
Спасибо
Не знаю почему, но я всё прекрасно понимаю, для меня это странно...Спасибо за уроки
Большое спасибо! Просим еще уроки по С++! Пожалуйста!
Спасибо большое за лучшие уроки!!
Большое спасибо за урок!
Спасибо!
В С++ вы не сможете вызвать делегирующий конструктор excepiton(const char*). Это будет работать только в VS.
Подскажите, почему?
@@user_x138 У exception нет конструктора для строкового значения, в VS используется расширение MSVC которое позволяет это делать. Чтобы передать строковое значение используют runtime_error или logic_error.
@@user-yn7gi6os8d ебанутся я после этих строк перестал понимать с++ а ведь всё было гладко)
@@gavyttop1341 Проще говоря, у exception в Virtual Studio прописан тот функционал, который позволяют использовать строчки в своем проекте. А в стандарте С++ нет, поэтому нужно извращаться иначе :)
@@user-yn7gi6os8d да кст я смотрел урок 2016 там всё if реализовано)))
спасибо
Потратил слишком много на рецептологические изложения материала. Автор излагает суть. Хорошо бы текстовую версию материала для ускорения и расшерение круга рассматриваемых вопросов. Очень хорошо.
Это пиздец.... ты просто изменил мировозрение программирования! Спасибо тебе за все!
Без const у меня не собирается:
MyException(const char *msg,int DataState) : exception(msg)
Это потому, что первый параметр - строка, а строка - это тип данных 'const char *'.
Аналогично. Спасибо за подсказку!
@Hemid Aliyev У вас тоже Visual Studio?
@Hemid Aliyev может быть из-за версий VS или внутренних настроек
У меня в кодблокс работает только вот с таким кодом MyException(string const &msg, int dataState):runtime_error(msg)//такая запись только для кодеблокс
Thank you for the lesson!
спасибо. Понятно как всегда.
Вот такой ещё конструктор имеется: exception(const char *const _Message, int) - Для чего там ещё один параметр int? И как его получить в catch?
При передаче массива char myfex(char *msg , int y):exception(msg){ k = y;} возникла проблема с передачей сообщения throw msg из функции " отсутствуют экземпляры конструктора "myfex::myfex" соответствующие списку аргументов типы аргументов [const char [32],int] " возможно поменяли какие-то стандарты, но сейчас это работает при myfex(const char *msg , int y):exception(msg){ k = y;}
Спасибо
Будут ли видео по Sokcet Client Server?
У меня объект ex не видит метод getDataState(). Хотя он находится модификаторе доступа public. А также время от времени подчеркивает базовый класс exception как несуществующий
Тоже столкнулся с такой ошибкой. У меня она пропала после того, как убрал const из catch, т.е: catch(MyException &ex). Не совсем понял, с чем это связано
P.S. Всё решается довольно просто (я фиг знаю почему так, но всё же. Не помню такой темы с const и методами класса). Надо после метода GetDataState() написать const, то есть вот так: int GetDataState() const {return this->dataState;}
Кстати + у автора у самого нет const перед MyException &ex (я только сейчас заметил), тогда всё решается первым способам (если вы просто написали случайно const, или не убирали его после того, как переименовали exception в My...), но для себя можно и вторым способом))
@@TGrod Спасибо за решение проблемы, но хотелось бы всё равно понять, почему она появляется.
@@Kokurorokuko я сейчас посмотрел и был очень удивлён тому, почему так получается. Оказывается у константного объекта мы можем вызывать ТОЛЬКО константные методы, иначе другие методы даже не будут проверяться на то, есть ли в нём способ изменения константного объекта или нет. Проще говоря надо писать константный метод (слово const после параметров), потому что у нас константный объект. На эту тему есть отличный урок на Ravesli. Называется "Классы и const в C++" 123 урок
почему при вызове метода GetDataState() выводится ошибка "Объект содержит квалификаторы типа, несовместимые с элементом функции"
убери const перед Myexception в catch
Урок просто &ex
прерывания будете рассматривать? мне было бы очень интерестно посмотреть как можно организовать цикличную работу программы пока я ввожу значение какой то переменной через "cin>>"
break; пропиши
Подскажите, где в VS Вы нашли сочетание клавиш, чтобы комментировать не построчно, а вот так: /*что-то*/ ?
нажми ctrl + k , ctrl + u
ctrl+k+c, ctrl+k+u
еще в конструкторе надо писать const char * msg
Минут 30 смотрел на код и не понимал в чем прикол, спасибо тебе ))))!!!!!!
@@user-vt1qt3ub1q Я тоже не сразу въехал, но потом немного посидел, и сам догнал )
лучший
я залип пздц
Здравствуйте, у меня вопрос.
Смотрите, вот Вы в первом своём варианте описали конструктор класса MyException как: MyExсeption(char * msg) : exception(msg){}
Почему (!) оно работает вместе с строкой типа sz, я имею ввиду, почему оно работает когда вы бросаете throw MyException("TEXT")
Ведь строка которой вы объявляете конструктор является именно строкой, а не ссылкой на первый элемент массива типа char.
Вы же в конструкторе в итоге принимаете не ссылку на объект типа char, а физически сам объект типа string.
строка тут как константа со ссылкой на себя, а не объект стринг
Можно вопрос? Скажите пожалуйста, на чём лучше писать GUI приложения только под windows? Я растерялся, очень много выбора. C++ builder, Qt creator, MFC, CLR, win32. Что лучше выбрать? возможно, и не из этого списка
C# WinForms или VPF
#SimpleCode но там же вроде нужен framework, а у он не у всех установлен и производительность ниже
net framework стоит на любой винде, начиная с XP
#SimpleCode спасибо, возможно попробую C#. а что из C++ посоветуете?
SЌĬP クラス да, но для него, как и для C# требуется .net framework. а я как раз хотел чтобы программы могли работать без него
Здравствуйте, стараюсь понимать ваши уроки, но не очень понимаю функцию записи в 8:05 на 15 строчке, а именно приписку ::exception(msg), что данная запись делает? Подскажите пжлст:)
это наследование) чекай урок по нему)
Это потомок свалил ответственность на предка !
11:36 строчка 33 у автора, компилятор говорит что exeption не принимает строковый литерал. Возможно ли что поменялся стандарт?
throw Myexception("один", value); треба було додати ще один параметр))))))))
Почему не присвоить значение полю dataState также в списке инициализации конструктора?
Почему обычный эксепшен в myexception не попадает ?
Вопрос, а почему в параметрах стоит указатель на тип char, а передаётся строка? Поидее же string должно быть, char же за символ единичный отвечает.
Строки задаются как массивы char, а массивы - указателями на элемент [0]. Т.е. char* a = "bla-bla" эквивалентно char* a = (const - от компилятора зависит) char[7] .
String - это тип из STL, так что в самом C++ строки реализованы через данную пень-колоду(хотя это и очевидное требование низкого уровня абстракции этого языка).
При том, заметьте, char* = const char писать вообще-то никак нельзя, так что компилятор в целом может начать ругаться на вас из-за собственной же реализации.
bruh
урок понял, но в Code::Blocks строка с конструктором не работает My_Exception( char *msg, int data_State): exception(msg), если изменить класс exception на logic_error всё работает за исключением Геттера
Повторяя за вами поулчаю ошибку class MyException : public exception {}; - error C2504: exception: не определен базовый класс
А ты подключил исключения через include ?
А если создать в своем классе MyException поле text, то нет смысла наследоваться от базового exception? Если там всего одна функция what... В своей программе получается можно обойтись самописным классом?
любой класс можно написать самостоятельно, но зачем делать, когда с тем же успехом можно не делать? Какой смысл от самописного класса, если есть готовый?
@@hdtrydyydyd2486 смысл, что в него можно добавить любой свой функционал. А не наследовать другой класс ради одной функции what()
@@pavelpolo9016 ну наверное базовый exception имеет смысл использовать только для стандартных функций и методов, которые кидают исключение в него
Например если std::stoi использовать, если эта функция не сможет перевести строку в целочисленный тип данных, она бросает исключение, наверн как раз в класс std::exception
Так что тут, либо ты используешь сам std::exception, либо наследуешь от него свой класс исключений, чтобы не пропустить исключение от того же stoi
А как после сообщения от exception организовать вторую, третью и т.д. try -попытку?
один из вариантов через цикл while(). Пока значение true выполняется цикл,
bool check = true;
while(check )
{
try
{
//код
check = false; // если не выбросило исключение.
}
catch()
{}
}
Вариант метки, go to
Кто-то знает, как этот - char *msg - "вывести" в VinForms ?
MessageBox::Show(ex.what()); - здесь просто - TRUE
Странно. Вроде пишу то же самое. А когда задаю аргумент в конструктор класса MyException, компилятор сообщает что не может конвертировать char в MyException. Не понимаю как это исправить.
Так выглядит мой класс.
class MyException : public exception {
public:
MyException(char* msg) {
cout
class MyExp :public exception
{
public:
MyExp(const char *msg):exception(msg)
{
}
В Яве все эти проблемы решены.
Спасибо за работу! Слишком много прыжков по разрозненным кускам кода, хотя весь код вполне можно уместить на одном экране, общей картины не видно, воспроизвести код не получается - не хватает текстового варианта.
Если не поймал, то - аборт :D
С С++11 char* name не будет работать, надо использовать const то-есть, const char* name
а почему в уроке об этом ни слова??
@@user-or1hy4xz8u многие команды,компании и т.д. не переходят на последнии версии языка, так как стандарт не прижился или ещё что-то. Вообщем причины для того?что бы остаться на предыдущей версии есть. Возможно автор сидел на до 11 версии стандарта(см. причину выше)
@@user-zq5zl8eq3z ого, 11 версия!!! Это ж принималось 11 лет назад!! Какой там говорить об 17 или 20й ...
спасибо :)
@@user-or1hy4xz8u Потому что "урок" сделан неграмотным балбесом.
Не хватает пояснения когда юзать, чтобы и не ставить где попало, и чтобы не пропускать где бы стоило эти блоки try-catch
Везде, где не уверен что не произойдет ошибки. Как правило, там где работа с файлами, там где диалог с пользователем и т.д.
up
Разве, я что-то не так написал?
#include "stdafx.h"
#include
using namespace std;
class MyException : public exception
{
public:
MyException(char * msg) : exception(msg)
{
}
};
void Foo(int n)
{
if (n == 5) throw MyException("Текст"); //Ошибка!!! Текст не является элементом типа char* и не может быть
cout
только теперь с геттером какие-то проблемы
напишите лучше так: MyException(const char * msg) : exception(msg)
@@Salavat1k Благодарочка за подсказку!!!
Скопировал код , но выдаётся ошибка что нет экземпляра конструктора MyException...
Там константы не хватает, раньше он это за предупреждение выдавал, а теперь за ошибку. Тоесть вот пропиши такой конструктор - MyException(const char *msg, int dataState):exception(msg)
Важное дополнение: класс exception может быть реализован по усмотрению разрабов std библиотеки. В виду чего параметры конструктора могут различаться количеством аргументов.
а что делать если я пишу exception но у меня он невидится?
Бред.
Не работает
кто ставит дизлайки?
throw Myexception("число дорівнює 1"); ошибка Severity Code Description Project File Line Suppression State
Error (active) E0289 no instance of constructor "Myexception::Myexception" matches the argument list Project44 C:\Users\Оксана\source
epos\Project44\Project44\Source.cpp 30
14:14 Тут стоит сказать немного иначе. Ищется не "самый подходящий" (самый подходящий как раз MyException), а первый подходящий catch. Таким образом вы неправильно ответили на свой вопрос =)
Акцент был на том, что они оба "самые подходящие" в равной степени, но срабатывает тот, кто первый
Спасибо за урок.
Спасибо за урок!
Спасибо
спасибо
спасибо