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

  Рет қаралды 32,035

XpucT

XpucT

5 жыл бұрын

Ссылка для донатов:
t.me/win10tweaker/171
Эксклюзив для спонсоров ➜ / xpuct
Если недоступна спонсорка ➜
Основной канал:
/ jailbreakvideo
#try #catch #finally #throw #Exception #cSharp #СиШарп

Пікірлер: 84
@Slonick
@Slonick 5 жыл бұрын
Лучше вместо Clipboard.Clear(); Clipboard.SetText() использовать Clipboard.SetObject() он с меньшей долей вероятности вываливает ошибку, что буфер не инициализирован
@XpucT
@XpucT 5 жыл бұрын
охохо))) Работает 🤟🏻 Закрепил 👍
@root7020
@root7020 5 жыл бұрын
Что-то не работает( С первым способом все копирует и вставляет, со вторым просто чистит буфер обмена.
@user-py5nd2sg4m
@user-py5nd2sg4m 4 жыл бұрын
Clipboard.SetDataObject(), наверное)
@user-bhmsbinary
@user-bhmsbinary Жыл бұрын
@@XpucT охохо ес
@alvoltta
@alvoltta 4 жыл бұрын
try { Читать метанит, половину не понять } catch { смотреть уроки от XpucT } finally { поставить лайк на видео }
@dimeolistrimer8125
@dimeolistrimer8125 3 жыл бұрын
на одном дыхании все 22 минуты просмотрел)))Спасибо за такие хорошие уроки
@kabukijoe99
@kabukijoe99 2 жыл бұрын
Читаю не всегда понятные книги по C# а потом прихожу на этот канал за розъянениями. Спасибо автору.
@AxiOmAxBETEP
@AxiOmAxBETEP 3 жыл бұрын
Мне нравится тактика изложения материала, все по полочкам и по порядку... в голове каши нету. Спасибо за лёгкое обучение с#...
@dmmhlchk
@dmmhlchk 2 жыл бұрын
Мужик, балдёжно объясняешь, а главное понятно. Однозначно лайк
@zazzzio
@zazzzio 4 жыл бұрын
Вник, поставил лайк, перешел к следующему видео. Спасибо, все доступно и понятно.
@avp8sk600
@avp8sk600 5 жыл бұрын
Огромное спасибо, интересные уроки супер.
@user-po5ui6vg5c
@user-po5ui6vg5c 3 жыл бұрын
Огонь объясняешь. Динамично.
@ConfirmedPlayer
@ConfirmedPlayer 2 жыл бұрын
Спасибо за гайд. Очень полезно!
@Hujik012
@Hujik012 Жыл бұрын
Лучший из лучших, много видосов пересмотрел, этот - самый понятный
@animationfantasymystic7311
@animationfantasymystic7311 3 жыл бұрын
Лучший! Сэнсэй! Здоровья тебе и долгих лет жизни! После 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); } }
@eliseyworker
@eliseyworker 2 ай бұрын
просто и наглядно. то, что я искал. спасибо!
@cerefka
@cerefka 5 жыл бұрын
Спасибо за занятия Хачатур.
@EasyAsHellEasier
@EasyAsHellEasier 2 жыл бұрын
Просто шикарное объяснение, лайк автору
@SCEEF
@SCEEF 4 жыл бұрын
Оо, так catch - можно юзать для записей ошибок в log, чтобы пользователи просто могли логи кидать, и ты сам смотрел ошибки =) + можно добавлять время, чтобы понимать когда ошибка была совершена)
@XpucT
@XpucT 4 жыл бұрын
*+*
@user-fc3gh1rb7w
@user-fc3gh1rb7w 4 жыл бұрын
Более того, объекты класса Excaption обладают всей необходимой информацией об ошибке. "За кулисами", когда возникает ошибка в Try, создается объект Excaption в той переменной (а если точнее, то переменная с ссылкой на объект), которую вы указали в скобочках - "ex" или "e" обычно. И через эту переменную можно получить всю всю информацию об ошибке. А если этой информации вам все же недостаточно, то так сказать, раскручиваем ООП на полную - наследуемся от Excapton, дополняем его дополнительными нужными нам полями, свойствами, методами, событиями и т.д. Таким образом мы инкапсулируем весь код в отдельный класс, и избавляемся от шаблонного в мэйне. Например, нужно писать ошибки в файл? - ок - Наследуемся от Excaption, Пишем в нем метод void SaveToFile(string fileName){//код сохранения данных в fineName }.
@Mr.Epsilion
@Mr.Epsilion 3 жыл бұрын
@@user-fc3gh1rb7w Thanks Dude :)
@user-zf7le3yd3d
@user-zf7le3yd3d 4 жыл бұрын
Как всегда на высоте!
@zx3002
@zx3002 Жыл бұрын
Спасибо, примеры топ
@fall1n1
@fall1n1 2 жыл бұрын
Благодаря Вам программирование превращается в =) СПАСИБО!
@orakul_azovstal
@orakul_azovstal 5 жыл бұрын
Уря я теперь умею обходить это зловредное исключение как оно меня мучало) а когда пробовал сам чёт не чего не получалось всё равно вылезало противное сообщение. Теперь я доволен и спокойно на сердце) Спасибо Хачатур я в своих познаниях благодаря тебе преодолел ещё одну ступеньку, как там говорится курочка по зёрнешку)))
@user-qy5tz9rq5l
@user-qy5tz9rq5l 5 жыл бұрын
*Зачем finally если код внутри него выполниться в любом случае, как и код после finally?* *Ответ:* finally используют для завершения потоков в основном. Да и так по красивше смотриться, когда в блоке try/catch/finally связанные данные. Не всегда выполняется код после finally. Например, у Вас есть try catch finally, где catch ловит, допустим, IndexOfOutException, а у вас вылетает IOException. И в этом случае, когда Вы ожидаете поймать одно исключение, но ловите НЕ ПРЕДУСМОТРЕННОЕ исключение, которое никак не обрабатываете, вот тогда то что за finally не выполнится, а сам finally выполнится.
@3d_toys
@3d_toys Жыл бұрын
Сложна, но хоть кто-то дал нормальный пример. Спасибо
@SheSaidYas
@SheSaidYas 3 жыл бұрын
Спасибо бро! Выручил )
@aleksadrfedotov8084
@aleksadrfedotov8084 Жыл бұрын
Отличные уроки
@nouchance
@nouchance 2 жыл бұрын
Спасибо большое за информацию! Лайкусик +1 😎👍✊🔥
@user-py5nd2sg4m
@user-py5nd2sg4m 4 жыл бұрын
еще по поводу остальных видов исключений. Из видео как-то не очень понятно, зачем они вообще, раз можно все отловить общим исключением Exception. Тем не менее, кэтчей может быть несколько, в первом ловим один вид исключения и посылаем юзера по одному адресу, в следующем кэтче - по другому, а если уж обстоятельства крайне неясные и косяк затерялся в глубинах кода, ловим в конце Exception. Спасибо за видео! Все очень круто, и легко и весело смотрится)
@pixel183
@pixel183 4 жыл бұрын
классные уроки все с полпинка понятно)
@sant226
@sant226 5 жыл бұрын
Наверное, стоит отметить, что директории это тоже файлы
@user-zk3ho3to2d
@user-zk3ho3to2d 4 жыл бұрын
спасибо))
@hotdog75rus
@hotdog75rus 3 жыл бұрын
Рекомендую обрабатывать конкретные классы потомки exception, в таком случае не нужно будет кучу ветвлений городить. Если вы в первом catch напишите (exception ex) вы перекроете себе возможность ловить конкретные типы классов наследников exception.
@bonefire2725
@bonefire2725 3 жыл бұрын
Еще можно было бы рассказать как ловить сразу несколько типов исключений с несколькими блоками catch. И наверно вместо ex.ToString() было лучше... или точнее сказать было бы информативнее использовать ex.Message
@user-vy4nm2vu7v
@user-vy4nm2vu7v 5 жыл бұрын
лайк!
@user-py5nd2sg4m
@user-py5nd2sg4m 4 жыл бұрын
Стоит уточнить, что finally выполняется не всегда. Самый простой случай: try { Close(); } catch { MessageBox.Show("catch block's working"); } finally { MessageBox.Show("Bugaga"); } Плюс если из Диспетчера закрыть программу, но это, пожалуй, очевидно. Плюс при работе с потоками, но это попозже.
@user-vl8su6br1g
@user-vl8su6br1g Жыл бұрын
Нас учили и говорили создавать свои собственные исключения=), а еще можно типа прописывать куеву тучу catch с определённым видом исключения, и определённый catch словит ту или иную ошибку, визуально превращается в как switch. Ваш код куда приятнее=)
@XpucT
@XpucT Жыл бұрын
catch на самом деле дорогое удовольствие, если на все случаи его использовать. Желательно предусматривать всё так, чтобы catch не понадобился.
@glorglorsky7987
@glorglorsky7987 4 жыл бұрын
у любого исключения есть , замечательное свойство ,которое возвращает только текст конкретной ошибки, без всякого хлама и мусора, это Message - Возвращает сообщение, описывающее текущее исключение поэтому лучше писать catch( Exception e ) { MessageBox.Show(e.Message, "что-то пошло не так") }
@worldgame4ik553
@worldgame4ik553 5 жыл бұрын
Я поставил 100ый лайк
@romay3477
@romay3477 Жыл бұрын
Хачатур, расскажи пожалуйста, можно ли менять положение формы в конструкторе или самому её приближать/увеличивать? Пробовал гуглить, не нагуглил
@XpucT
@XpucT Жыл бұрын
Вроде бы нельзя. Сделано, чтобы Ты видел точно, как она будет выглядеть.
@user-wu-tang
@user-wu-tang Жыл бұрын
Хачатур привет видео очень крутое, нужно раз 5 посмотреть, чтоб усвоилось)) А можно в (try, catch, finally) писать тернарно код, чтоб сократить код ?
@XpucT
@XpucT Жыл бұрын
Можно 👍
@JamesBond-bu8co
@JamesBond-bu8co 6 ай бұрын
Приветствую всех! Подскажите, пожалуйста, как в Visual Studio 2022 отключить автосохранение проектов? Только начал изучать программирование, и уже измучался - захожу в проекты с примерами из уроков, чтобы поэкспериментировать и пописать фигню чтобы лучше понять и запомнить, а фигня автоматически сохраняется)))
@grabson8232
@grabson8232 5 жыл бұрын
Здравствуйте, Хачатур, подскажите пожалуйста как впихнуть в переменную случайно сгенерированное значение (цифру в int например), заранее благодарю ✌️
@XpucT
@XpucT 5 жыл бұрын
Добрый день 🖐 Random random = new Random(); int number = random.Next(1, 20); // Случайное число от 1 до 20
@saintmaloj
@saintmaloj 4 жыл бұрын
@@XpucT от 1 до 19, вроде, не?
@PravdaGe
@PravdaGe 3 жыл бұрын
Доброго времянки суток Господа! Подскажите а как скрыть окно Ошибки ? Сам код: no such element: Unable to locate element: {"method":"css selector","selector":".link"} (Session info: chrome=91.0.4472.106). Когда программа не находит Элемент на стр. сайта окно с ошибкой, когда есть все хорошо
@user-mv7vt7bw2w
@user-mv7vt7bw2w 2 жыл бұрын
Приветствую! Во время просмотра урока №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
@user-ze4dx1om3x
@user-ze4dx1om3x Жыл бұрын
В этом комменте будет неслабое полотно текста, но, надеюсь, оно будет полезно кому-либо Первое. Я тут обратил внимание как ты переименовываешь свои переменные. В общем, если выбрать переменную в любом месте (объявление, инициализация, использование где-то --- не суть), нажать 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. Да и в целом там тонны полезной инфы по синтаксису, но написано это довольно сложным техническим языком, так что читать может быть туговато. Но все равно чертовски полезный источник инфы
@XpucT
@XpucT Жыл бұрын
@VirusNew17
@VirusNew17 Жыл бұрын
12:01 пон
@absenth2672
@absenth2672 3 жыл бұрын
Приветствую Хачатур, спасибо тебе за мега полезные уроки! Просьба не совсем по видео, не могу найти решение: вывести из текстбокса число double с плавающей точкой. Все методы, представленные гуглом не помогают. (Шаг по времени 0.01 с)
@XpucT
@XpucT 3 жыл бұрын
Привет, Толя 🖐 Не совсем понял, в чём проблема. Просто из числа в текст перевести? Такой урок был.
@absenth2672
@absenth2672 3 жыл бұрын
@@XpucT вау, даже не насчитывал на такой скорый ответ. Нет, из текст бокса десятисные дроби, потом участвуют в расчете. Т. Е из стринга-текстбокса получить именно double с плавающей точкой. (Например 0.1 или 0.087) и тд
@absenth2672
@absenth2672 3 жыл бұрын
@@XpucT dT = double.Parse(textBox4.Text); V2 = Convert.ToDouble(textBox3.Text); эти способы работают, только в том случае, когда в текстбоксы вводятся только целые числа
@XpucT
@XpucT 3 жыл бұрын
Convert.ToDouble(textBox3.Text); - этого более чем достаточно. Скорее всего Ты вводишь 0.33 вместо 0,33 Тебе нужно создать событие, которое заменяет точку на запятую 👍 Показывал в уроке Regex, если не ошибаюсь.
@absenth2672
@absenth2672 3 жыл бұрын
@@XpucT спасибо огромное!!!
@aleksandr-kj6dv
@aleksandr-kj6dv 4 жыл бұрын
Почему File.Move и Directory.Move умеют только нормально переименовывать файл хотя в описании написано , что они перемещают в новую папку файл а вместо перемещения в новую директорию они создают папку.Я пробовал всяко разно изменять путь. И File.Copy такая же чешуя. Ах да, еще и Exception выбрасывает якобы не удалось найти часть пути.
@XpucT
@XpucT 4 жыл бұрын
Вот это действительно косяк. Сам первый раз вообще выпал, когда столкнулся. Можно рекурсией файлы таскать, как предлагается, но Я лично делаю это через Basic: Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory("sourse", "destination"); Microsoft.VisualBasic.FileIO.FileSystem.MoveDirectory("sourse", "destination");
@aleksandr-kj6dv
@aleksandr-kj6dv 4 жыл бұрын
@@XpucT Я сам себя обманул с условием.У меня переменная для создания папки и копирования в созданную папку было общим.
@f.social7186
@f.social7186 2 жыл бұрын
Как отправить сообщение или файл на почту или в телегу можешь объяснить пожалуйста?
@XpucT
@XpucT 2 жыл бұрын
Перезадай этот вопрос на форуме: win10tweaker.ru/forum/forum/%d1%81/
@pavel2702
@pavel2702 Жыл бұрын
УМОЛЯЮ СКАЖИТЕ ГДЕ ТАКОЙ КУРСОР ВЗЯТЬ
@XpucT
@XpucT Жыл бұрын
Win 10 Tweaker ➜ Интерфейс ➜ Установить авторские чёрные курсоры
@PeterFoxKills
@PeterFoxKills Жыл бұрын
У меня чет бяда с этим клипбордом. Иногда всё ок, а иногда на моменте, когда код доходит до Clipboard.Clear(); Clipboard.SetText(text); выбивает catch. Не понимаю что за дела, в интернете нет ничего об этом. Не копирует текст в него и хоть ты тресни
@user-cw9ev9dq4v
@user-cw9ev9dq4v 4 жыл бұрын
Иногда пишут просто throw; Не понял, зачем так делать
@XpucT
@XpucT 4 жыл бұрын
Чтобы сознательно выбило ошибку.
@F_elixfelicis
@F_elixfelicis 4 жыл бұрын
А где throw?
@XpucT
@XpucT 4 жыл бұрын
Тут два варианта: Вы либо смотрели в перемотке и материал таким образом не рекомендую изучать, либо где-то внутри Вас сидит учитель и шепчет: покажи утуберам, кто тут кодер =) Таймкод: 12:21
@F_elixfelicis
@F_elixfelicis 4 жыл бұрын
@@XpucT спасибо большое) Конечно и не думал Вас учить и замечаниям делать, просто ради throw и зашёл) Буду внимательнее) Возможно в метро просто отвлекся и не углядел
@XpucT
@XpucT 4 жыл бұрын
@@F_elixfelicis ;)
@F_elixfelicis
@F_elixfelicis 4 жыл бұрын
@@XpucT и вопрос не по теме, не будет уроков по wpf mvvm?
@XpucT
@XpucT 4 жыл бұрын
@@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 во второй раз.
Уроки C# - циклы, while, do while - Урок 14
10:25
FOOLED THE GUARD🤢
00:54
INO
Рет қаралды 63 МЛН
Жайдарман | Туған күн 2024 | Алматы
2:22:55
Jaidarman OFFICIAL / JCI
Рет қаралды 1,4 МЛН
Мы никогда не были так напуганы!
00:15
Аришнев
Рет қаралды 4,4 МЛН
Василиса наняла личного массажиста 😂 #shorts
00:22
Денис Кукояка
Рет қаралды 9 МЛН
Исключения (Exception) в C# - Учим Шарп #14
1:07:33
ЭТИ КНИГИ СДЕЛАЮТ ИЗ ТЕБЯ ХАКЕРА
16:38
Что должен знать C# Junior разработчик?
9:33
Sergey Nemchinskiy
Рет қаралды 93 М.
Обработка исключений в контроллерах Spring
10:48
Алексей Кутепов
Рет қаралды 2,8 М.
Собери ПК и Получи 10,000₽
1:00
build monsters
Рет қаралды 1,8 МЛН
ИГРОВОВЫЙ НОУТ ASUS ЗА 57 тысяч
25:33
Ремонтяш
Рет қаралды 292 М.
iPhone 12 socket cleaning #fixit
0:30
Tamar DB (mt)
Рет қаралды 55 МЛН