Уроки C# - try, catch, finally, Обработка исключений, throw new Exception ex - Урок 13

Поділитися
Вставка
  • Опубліковано 17 жов 2024

КОМЕНТАРІ • 84

  • @Slonick
    @Slonick 5 років тому +26

    Лучше вместо
    Clipboard.Clear();
    Clipboard.SetText()
    использовать
    Clipboard.SetObject()
    он с меньшей долей вероятности вываливает ошибку, что буфер не инициализирован

    • @XpucT
      @XpucT  5 років тому +5

      охохо))) Работает 🤟🏻
      Закрепил 👍

    • @root7020
      @root7020 5 років тому

      Что-то не работает( С первым способом все копирует и вставляет, со вторым просто чистит буфер обмена.

    • @ЕвгенияЕвгения-о6э
      @ЕвгенияЕвгения-о6э 4 роки тому +2

      Clipboard.SetDataObject(), наверное)

    • @bhms-binary
      @bhms-binary Рік тому

      @@XpucT охохо ес

  • @alvoltta
    @alvoltta 4 роки тому +51

    try
    {
    Читать метанит, половину не понять
    }
    catch
    {
    смотреть уроки от XpucT
    }
    finally
    {
    поставить лайк на видео
    }

  • @dimeolistrimer8125
    @dimeolistrimer8125 3 роки тому +15

    на одном дыхании все 22 минуты просмотрел)))Спасибо за такие хорошие уроки

  • @dmmhlchk
    @dmmhlchk 3 роки тому +3

    Мужик, балдёжно объясняешь, а главное понятно. Однозначно лайк

  • @xBETEP
    @xBETEP 4 роки тому +2

    Мне нравится тактика изложения материала, все по полочкам и по порядку... в голове каши нету. Спасибо за лёгкое обучение с#...

  • @eliseyworker
    @eliseyworker 6 місяців тому +1

    просто и наглядно. то, что я искал. спасибо!

  • @kabukijoe99
    @kabukijoe99 3 роки тому +5

    Читаю не всегда понятные книги по C# а потом прихожу на этот канал за розъянениями. Спасибо автору.

  • @zazzzio
    @zazzzio 4 роки тому +5

    Вник, поставил лайк, перешел к следующему видео. Спасибо, все доступно и понятно.

  • @animationfantasymystic7311
    @animationfantasymystic7311 4 роки тому +1

    Лучший! Сэнсэй! Здоровья тебе и долгих лет жизни! После 19 уроков мне захотелось, вот просто хочу и все! Чтоб нажал по кнопке и текст из файла перекочевал в другой файл, вот хочу я так и все.
    void button1_Click(object sender, EventArgs e)
    {
    Method();
    }
    void Method()
    {
    string r;
    string schit = @"C:\1.txt";
    string zapis = @"C:\2.txt";
    using (StreamReader sr = new StreamReader(schit, System.Text.Encoding.Default))
    {
    r = sr.ReadToEnd();
    }
    using (StreamWriter sw = new StreamWriter(zapis, false, System.Text.Encoding.Default))
    {
    sw.WriteLine(r);
    }
    }

  • @fall1n1
    @fall1n1 3 роки тому +1

    Благодаря Вам программирование превращается в =) СПАСИБО!

  • @Hujik012
    @Hujik012 Рік тому +1

    Лучший из лучших, много видосов пересмотрел, этот - самый понятный

  • @ConfirmedPlayer
    @ConfirmedPlayer 2 роки тому +1

    Спасибо за гайд. Очень полезно!

  • @avp8sk600
    @avp8sk600 5 років тому +4

    Огромное спасибо, интересные уроки супер.

  • @БабекАбдуллаев-о9п
    @БабекАбдуллаев-о9п 3 роки тому +1

    Огонь объясняешь. Динамично.

  • @VCSelfDevelopment
    @VCSelfDevelopment 5 років тому +17

    *Зачем finally если код внутри него выполниться в любом случае, как и код после finally?*
    *Ответ:* finally используют для завершения потоков в основном. Да и так по красивше смотриться, когда в блоке try/catch/finally связанные данные.
    Не всегда выполняется код после finally. Например, у Вас есть try catch finally, где catch ловит, допустим, IndexOfOutException, а у вас вылетает IOException. И в этом случае, когда Вы ожидаете поймать одно исключение, но ловите НЕ ПРЕДУСМОТРЕННОЕ исключение, которое никак не обрабатываете, вот тогда то что за finally не выполнится, а сам finally выполнится.

    • @3d_toys
      @3d_toys Рік тому +1

      Сложна, но хоть кто-то дал нормальный пример. Спасибо

  • @cerefka
    @cerefka 5 років тому +4

    Спасибо за занятия Хачатур.

  • @SCEEF
    @SCEEF 5 років тому +12

    Оо, так catch - можно юзать для записей ошибок в log, чтобы пользователи просто могли логи кидать, и ты сам смотрел ошибки =) + можно добавлять время, чтобы понимать когда ошибка была совершена)

    • @XpucT
      @XpucT  5 років тому

      *+*

    • @АндрейГоляновский-х4й
      @АндрейГоляновский-х4й 4 роки тому +6

      Более того, объекты класса Excaption обладают всей необходимой информацией об ошибке. "За кулисами", когда возникает ошибка в Try, создается объект Excaption в той переменной (а если точнее, то переменная с ссылкой на объект), которую вы указали в скобочках - "ex" или "e" обычно. И через эту переменную можно получить всю всю информацию об ошибке. А если этой информации вам все же недостаточно, то так сказать, раскручиваем ООП на полную - наследуемся от Excapton, дополняем его дополнительными нужными нам полями, свойствами, методами, событиями и т.д. Таким образом мы инкапсулируем весь код в отдельный класс, и избавляемся от шаблонного в мэйне. Например, нужно писать ошибки в файл? - ок - Наследуемся от Excaption, Пишем в нем метод void SaveToFile(string fileName){//код сохранения данных в fineName }.

    • @Mr.Epsilion
      @Mr.Epsilion 3 роки тому

      @@АндрейГоляновский-х4й Thanks Dude :)

  • @aleksadrfedotov8084
    @aleksadrfedotov8084 Рік тому +1

    Отличные уроки

  • @ЕвгенияЕвгения-о6э
    @ЕвгенияЕвгения-о6э 4 роки тому +2

    еще по поводу остальных видов исключений. Из видео как-то не очень понятно, зачем они вообще, раз можно все отловить общим исключением Exception. Тем не менее, кэтчей может быть несколько, в первом ловим один вид исключения и посылаем юзера по одному адресу, в следующем кэтче - по другому, а если уж обстоятельства крайне неясные и косяк затерялся в глубинах кода, ловим в конце Exception. Спасибо за видео! Все очень круто, и легко и весело смотрится)

  • @EasyAsHellEasier
    @EasyAsHellEasier 2 роки тому +1

    Просто шикарное объяснение, лайк автору

  • @orakul_azovstal
    @orakul_azovstal 5 років тому +1

    Уря я теперь умею обходить это зловредное исключение как оно меня мучало) а когда пробовал сам чёт не чего не получалось всё равно вылезало противное сообщение. Теперь я доволен и спокойно на сердце) Спасибо Хачатур я в своих познаниях благодаря тебе преодолел ещё одну ступеньку, как там говорится курочка по зёрнешку)))

  • @zx3002
    @zx3002 Рік тому +1

    Спасибо, примеры топ

  • @nouchance
    @nouchance 2 роки тому +1

    Спасибо большое за информацию! Лайкусик +1 😎👍✊🔥

  • @ПавелЮров-з9ж
    @ПавелЮров-з9ж Рік тому +1

    Нас учили и говорили создавать свои собственные исключения=), а еще можно типа прописывать куеву тучу catch с определённым видом исключения, и определённый catch словит ту или иную ошибку, визуально превращается в как switch. Ваш код куда приятнее=)

    • @XpucT
      @XpucT  Рік тому +2

      catch на самом деле дорогое удовольствие, если на все случаи его использовать.
      Желательно предусматривать всё так, чтобы catch не понадобился.

  • @romay3477
    @romay3477 2 роки тому +1

    Хачатур, расскажи пожалуйста, можно ли менять положение формы в конструкторе или самому её приближать/увеличивать? Пробовал гуглить, не нагуглил

    • @XpucT
      @XpucT  2 роки тому

      Вроде бы нельзя. Сделано, чтобы Ты видел точно, как она будет выглядеть.

  • @ЕвгенияЕвгения-о6э
    @ЕвгенияЕвгения-о6э 4 роки тому +1

    Стоит уточнить, что finally выполняется не всегда. Самый простой случай:
    try { Close(); }
    catch { MessageBox.Show("catch block's working"); }
    finally { MessageBox.Show("Bugaga"); }
    Плюс если из Диспетчера закрыть программу, но это, пожалуй, очевидно. Плюс при работе с потоками, но это попозже.

  • @pixel183
    @pixel183 4 роки тому +2

    классные уроки все с полпинка понятно)

  • @hotdog75rus
    @hotdog75rus 3 роки тому +1

    Рекомендую обрабатывать конкретные классы потомки exception, в таком случае не нужно будет кучу ветвлений городить. Если вы в первом catch напишите (exception ex) вы перекроете себе возможность ловить конкретные типы классов наследников exception.

  • @ВладимирВладимирович-ю6х

    Как всегда на высоте!

  • @SheSaidYas
    @SheSaidYas 3 роки тому +1

    Спасибо бро! Выручил )

  • @sant226
    @sant226 5 років тому +6

    Наверное, стоит отметить, что директории это тоже файлы

  • @glorglorsky7987
    @glorglorsky7987 4 роки тому +1

    у любого исключения есть , замечательное свойство ,которое возвращает только текст конкретной ошибки, без всякого хлама и мусора, это Message - Возвращает сообщение, описывающее текущее исключение
    поэтому лучше писать
    catch( Exception e )
    {
    MessageBox.Show(e.Message, "что-то пошло не так")
    }

  • @bonefire2725
    @bonefire2725 3 роки тому +1

    Еще можно было бы рассказать как ловить сразу несколько типов исключений с несколькими блоками catch. И наверно вместо ex.ToString() было лучше... или точнее сказать было бы информативнее использовать ex.Message

  • @user-wu-tang
    @user-wu-tang Рік тому +1

    Хачатур привет
    видео очень крутое, нужно раз 5 посмотреть, чтоб усвоилось))
    А можно в (try, catch, finally) писать тернарно код, чтоб сократить код ?

    • @XpucT
      @XpucT  Рік тому +1

      Можно 👍

  • @КапляРосы-ш6э
    @КапляРосы-ш6э 4 роки тому +1

    спасибо))

  • @JamesBond-bu8co
    @JamesBond-bu8co 9 місяців тому

    Приветствую всех! Подскажите, пожалуйста, как в Visual Studio 2022 отключить автосохранение проектов? Только начал изучать программирование, и уже измучался - захожу в проекты с примерами из уроков, чтобы поэкспериментировать и пописать фигню чтобы лучше понять и запомнить, а фигня автоматически сохраняется)))

  • @worldgame4ik553
    @worldgame4ik553 5 років тому +4

    Я поставил 100ый лайк

  • @AlexandrPister
    @AlexandrPister 2 роки тому +1

    Приветствую! Во время просмотра урока №13 придумал себе дз.
    Заключается оно в том: на рабочем столе нет файла 1.txt и я прошу программу его удалить. (если он есть - он удалится успешно), следом программа говорит, что файла нет. создать его? При нажатии на "да" она его создает. Следом сообщает, что файл создан. Удалить его? При нажатии на да, она его должна удалить. Но она выводит ошибку "Процусс не может получить доступ к файлу "...1.txt" так как этот файл используется другим процессом. Как это исправить?
    void Button1_Click(object sender, EventArgs e)
    {
    //попробуй сделать
    try
    {
    File.Delete(@"C:\Users\Lutci\Desktop\1.txt");
    {
    DialogResult result = MessageBox.Show("Такого файла нет. Создать?", "Опача",
    MessageBoxButtons.YesNo, MessageBoxIcon.Question);
    if (result == DialogResult.Yes)
    {
    File.Create(@"C:\Users\Lutci\Desktop\1.txt");
    }
    try
    {
    DialogResult result2 = MessageBox.Show("Файл успешно создан. Удалить?", "Опача",
    MessageBoxButtons.YesNo, MessageBoxIcon.Question);
    if (result2 == DialogResult.Yes)
    {
    File.Delete(@"C:\Users\Lutci\Desktop\1.txt");
    }
    }
    catch
    {
    File.Exists(@"C:\Users\Lutci\Desktop\1.txt");
    DialogResult result3 = MessageBox.Show("Файл не удален. Попробовать ещё раз?", "Опача",
    MessageBoxButtons.YesNo, MessageBoxIcon.Question);
    if (result3 == DialogResult.Yes)
    {
    File.Delete(@"C:\Users\Lutci\Desktop\1.txt");
    }
    }
    }

    }
    //если не получилось, то сделай это
    catch
    {
    File.Delete(@"C:\Users\Lutci\Desktop\1.txt");
    }

    • @XpucT
      @XpucT  2 роки тому

      Привет 🖐
      File.Create - очень плохая практика.
      Замени на File.AppendAllText
      Таким образом файл не будет занят.
      Create требует его освобождения (Close, Dispose и прочее, но лучше даже не вникать).
      Create никогда не делается. Далее в курсе показано как работать с созданием файлов, написанием и т.д.
      Пока делай Просто File.AppendAllText

  • @PravdaGe
    @PravdaGe 3 роки тому

    Доброго времянки суток Господа!
    Подскажите а как скрыть окно Ошибки ?
    Сам код:
    no such element: Unable to locate element: {"method":"css selector","selector":".link"}
    (Session info: chrome=91.0.4472.106).
    Когда программа не находит Элемент на стр. сайта окно с ошибкой, когда есть все хорошо

  • @АркМеф
    @АркМеф 2 роки тому +1

    В этом комменте будет неслабое полотно текста, но, надеюсь, оно будет полезно кому-либо
    Первое. Я тут обратил внимание как ты переименовываешь свои переменные. В общем, если выбрать переменную в любом месте (объявление, инициализация, использование где-то --- не суть), нажать F2 и переименовать, то VS переименует ее везде где она используется, но в пределах контекста. То-бишь:
    {
    int i = 0;
    i++;
    }
    {
    int i = 3;
    i += 2;
    }
    i в первых скобках и во вторых - это 2 разные i, соответственно переименование i в первых скобках не затронет ее во вторых.
    Видео, конечно, относительно старое, так что, возможно, ты уже знаешь об этом, но лишним в любом случае не будет х)
    Второе. Можно трай-кэтч может перехватывать конкретные исключения и пропускать остальные
    Пример:
    try
    {
    byte i = Convert.ToByte(ReadLine());
    }
    catch(OverflowException)
    {
    WriteLine("Вы ввели слишком большое число");
    }
    В данном случае мы делаем 3 ввода: число 1, число 1234, и строку qwer.
    Число 1 подходит байту и не выбрасывает исключений вообще.
    Число 1234 находится за пределами байта (от 0 до 255) и выбрасывает исключение OverflowException, которое мы перехватываем, переходим в кэтч и получаем на вывод строку "Вы ввели слишком большое число".
    Строка qwer вообще не подходит байту т.к. байт принимает только числа, и в итоге мы получаем исключение FormatException. Мы его никак не обрабатываем в кэтче, и в итоге программа выбрасывает исключение как обычно
    Можно модифицировать данный код на обработку нескольких исключений:
    try
    {
    byte i = Convert.ToByte(ReadLine());
    }
    catch(OverflowException)
    {
    WriteLine("Вы ввели слишком большое число");
    }
    catch(FormatException)
    {
    WriteLine("Вы ввели недопустимый символ");
    }
    В этом случае числа 1 и 1234 срабатывают как и в предыдущем (1 - нормально проходит, 1234 - обрабатывается исключением соответственно), НО мы также обрабатываем FormatException и получаем на вывод "Вы ввели недопустимый символ".
    На мой взгляд весьма полезная штука, когда мы хотим чтобы юзверь знал, что он делает что-то не так, но не хотим останавливать работу программы или пугать его тонной страшных кракозябр, которые ему не нужны. Ну или банально ловить только те исключения, которые мы хотим, но при этом не трогать остальные
    Также важный момент: классы OverFlowException, FormatException, etc являются наследниками класса SystemException, который в свою очередь является наследником класса Exception.
    Так что можно писать catch(OverflowException ex) и использовать его аналогично твоему примеру в видео catch(Exception ex), но для одного конкретного исключения (в данном случае оверфлоу). Например, выводить юзверю простое "Вы ввели слишком большое число", но в то же время в лог-файлы записывать ошибку полностью.
    Так же можно еще модифицировать код выше:
    try
    {
    byte i = Convert.ToByte(ReadLine());
    }
    catch (OverflowException)
    {
    WriteLine("Вы ввели слишком большое число");
    }
    catch (FormatException)
    {
    WriteLine("Вы ввели недопустимый символ");
    }
    catch (Exception)
    {
    WriteLine("Неизвестная ошибка");
    }
    В этом случае мы будем перехватывать оверфлоу и формат и обрабатывать их так как нам нужно, а на все остальные исключения выводить на консоль просто "Неизвестная ошибка". Только нельзя ставить catch (Exception) первым т.к. он просто будет перехватывать все исключения, и остальные кэтчи будут бесполезны. При этом будет ошибка компилятора, и код тупо не скомпилируется
    Это не все варианты использования трай-кэтч, лишь те, с которыми я успел познакомиться, и также там еще есть свои нюансы. Можно почитать больше тут: docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/try-catch. Да и в целом там тонны полезной инфы по синтаксису, но написано это довольно сложным техническим языком, так что читать может быть туговато. Но все равно чертовски полезный источник инфы

  • @grabson8232
    @grabson8232 5 років тому

    Здравствуйте, Хачатур, подскажите пожалуйста как впихнуть в переменную случайно сгенерированное значение (цифру в int например), заранее благодарю ✌️

    • @XpucT
      @XpucT  5 років тому

      Добрый день 🖐
      Random random = new Random();
      int number = random.Next(1, 20); // Случайное число от 1 до 20

    • @saintmaloj
      @saintmaloj 4 роки тому +1

      @@XpucT от 1 до 19, вроде, не?

  • @ВладПідгайний-х8э
    @ВладПідгайний-х8э 5 років тому +2

    лайк!

  • @f.social7186
    @f.social7186 3 роки тому +1

    Как отправить сообщение или файл на почту или в телегу можешь объяснить пожалуйста?

    • @XpucT
      @XpucT  3 роки тому

      Перезадай этот вопрос на форуме:
      win10tweaker.ru/forum/forum/%d1%81/

  • @absenth2672
    @absenth2672 4 роки тому

    Приветствую Хачатур, спасибо тебе за мега полезные уроки! Просьба не совсем по видео, не могу найти решение: вывести из текстбокса число double с плавающей точкой. Все методы, представленные гуглом не помогают. (Шаг по времени 0.01 с)

    • @XpucT
      @XpucT  4 роки тому +1

      Привет, Толя 🖐
      Не совсем понял, в чём проблема.
      Просто из числа в текст перевести? Такой урок был.

    • @absenth2672
      @absenth2672 4 роки тому

      @@XpucT вау, даже не насчитывал на такой скорый ответ. Нет, из текст бокса десятисные дроби, потом участвуют в расчете. Т. Е из стринга-текстбокса получить именно double с плавающей точкой. (Например 0.1 или 0.087) и тд

    • @absenth2672
      @absenth2672 4 роки тому

      @@XpucT dT = double.Parse(textBox4.Text);
      V2 = Convert.ToDouble(textBox3.Text);
      эти способы работают, только в том случае, когда в текстбоксы вводятся только целые числа

    • @XpucT
      @XpucT  4 роки тому +1

      Convert.ToDouble(textBox3.Text); - этого более чем достаточно.
      Скорее всего Ты вводишь 0.33 вместо 0,33
      Тебе нужно создать событие, которое заменяет точку на запятую 👍
      Показывал в уроке Regex, если не ошибаюсь.

    • @absenth2672
      @absenth2672 4 роки тому

      @@XpucT спасибо огромное!!!

  • @pavel2702
    @pavel2702 2 роки тому +1

    УМОЛЯЮ СКАЖИТЕ ГДЕ ТАКОЙ КУРСОР ВЗЯТЬ

    • @XpucT
      @XpucT  2 роки тому +1

      Win 10 Tweaker ➜ Интерфейс ➜ Установить авторские чёрные курсоры

  • @aleksandr-kj6dv
    @aleksandr-kj6dv 4 роки тому +1

    Почему File.Move и Directory.Move умеют только нормально переименовывать файл хотя в описании написано , что они перемещают в новую папку файл а вместо перемещения в новую директорию они создают папку.Я пробовал всяко разно изменять путь. И File.Copy такая же чешуя. Ах да, еще и Exception выбрасывает якобы не удалось найти часть пути.

    • @XpucT
      @XpucT  4 роки тому +2

      Вот это действительно косяк. Сам первый раз вообще выпал, когда столкнулся.
      Можно рекурсией файлы таскать, как предлагается, но Я лично делаю это через Basic:
      Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory("sourse", "destination");
      Microsoft.VisualBasic.FileIO.FileSystem.MoveDirectory("sourse", "destination");

    • @aleksandr-kj6dv
      @aleksandr-kj6dv 4 роки тому

      @@XpucT Я сам себя обманул с условием.У меня переменная для создания папки и копирования в созданную папку было общим.

  • @VirusNew17
    @VirusNew17 Рік тому

    12:01 пон

  • @Собственник-т3к
    @Собственник-т3к 4 роки тому

    Иногда пишут просто throw; Не понял, зачем так делать

    • @XpucT
      @XpucT  4 роки тому

      Чтобы сознательно выбило ошибку.

  • @F_elixfelicis
    @F_elixfelicis 5 років тому

    А где throw?

    • @XpucT
      @XpucT  5 років тому +3

      Тут два варианта:
      Вы либо смотрели в перемотке и материал таким образом не рекомендую изучать, либо где-то внутри Вас сидит учитель и шепчет: покажи утуберам, кто тут кодер =)
      Таймкод: 12:21

    • @F_elixfelicis
      @F_elixfelicis 5 років тому +2

      @@XpucT спасибо большое) Конечно и не думал Вас учить и замечаниям делать, просто ради throw и зашёл) Буду внимательнее) Возможно в метро просто отвлекся и не углядел

    • @XpucT
      @XpucT  5 років тому +2

      @@F_elixfelicis ;)

    • @F_elixfelicis
      @F_elixfelicis 5 років тому

      @@XpucT и вопрос не по теме, не будет уроков по wpf mvvm?

    • @XpucT
      @XpucT  5 років тому +1

      @@F_elixfelicis очень вероятно, что будут, потому что в сети не видел ещё ни одного урока или курса, чтобы была понятна модель с первых шагов.

  • @cegofont4132
    @cegofont4132 2 роки тому

    А по какой причине у меня finally не выполняется выдает ошибку на второй try, оповещение не выводится, а вышло оповещение один раз, когда код сменил во время запуска private void Button1_Click(object sender, EventArgs e)
    {
    try
    {
    Directory.Delete(@"D:\Рабочий стол\Sasha\PROGIS\ю");
    }
    catch
    {
    label1.Text = "НЕТ ТАКОЙ ПАПКИ!!!";
    }
    finally
    {
    try
    {
    Directory.Delete(@"D:\Рабочий стол\Sasha\PROGIS\ю");
    }
    finally
    {
    MessageBox.Show("Харэ тыкать","Бомбёж", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
    }
    }
    Оповещение вышло, только когда я во время запущенной программы стёр MessageBoxButtons.OK, MessageBoxIcon.Asterisk.
    после стерания MessageBoxButtons.OK, MessageBoxIcon.Asterisk. перебрасывает на program.cs показывает ошибку нажимаешь продолжить и выходит оповещение MessageBox, что за фигня не могу понять

    • @XpucT
      @XpucT  2 роки тому

      Выдаёт ошибку, потому что она не обрабатывается с помощью catch и программа ломается.
      До finally добраться нельзя, если сломать программу, что собственно Ты и делаешь, не обрабатывая catch во второй раз.