Re[8]: Почему в расте отсутствует выброс исключений?
От: T4r4sB Россия  
Дата: 05.12.22 14:22
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Можно скомпилировать с panic=abort (https://doc.rust-lang.org/book/ch09-01-unrecoverable-errors-with-panic.html), тогда никакой раскрутки стека,

Z>просто будет падать при панике.

Прочитай ветку с самого начала. В том-то и дело, что аборт это вызов специальной инструкции, которая в вин7 как раз кидает исключение.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[7]: Почему в расте отсутствует выброс исключений?
От: flаt  
Дата: 05.12.22 15:01
Оценка:
Здравствуйте, T4r4sB, Вы писали:


F>>И..? А что ожидалось?


TB>А почему нельзя просто завалить приложение?! Почему для х64 так и сделано, а для х86, запускаемом на х64, нет?


Так это к MS вопрос, а не к Rust. Так-то перехват необработанных исключений в WndProc — известная фишка, хотя я не знал, что в Win8 это починили.

В любом случае, в проброс исключений между границами — UB, и уже не важно, в чём оно (не) проявляется.
Re[9]: Почему в расте отсутствует выброс исключений?
От: flаt  
Дата: 05.12.22 15:08
Оценка:
Здравствуйте, T4r4sB, Вы писали:


TB>Прочитай ветку с самого начала. В том-то и дело, что аборт это вызов специальной инструкции, которая в вин7 как раз кидает исключение.


Ты хочешь сказать, что https://doc.rust-lang.org/std/intrinsics/fn.abort.html компилируется в инструкцию, которая перехватывается wndproc? А https://doc.rust-lang.org/std/process/fn.abort.html, который компилируется в libc::abort — завершает процесс, как и положено?

В таком случае, это баг.

А нет, не баг: https://github.com/rust-lang/rust/blame/57572cf8096ccb332370f7a711641a061bfd7434/library/std/src/sys/windows/mod.rs#L303-L319

Это они выпилили поддержку Windows 7 не так давно (против чего было много возмущений, но в расте сидят хиппи и им лень поддерживать старые ОС).
Отредактировано 05.12.2022 15:19 flаt . Предыдущая версия .
Re[10]: Почему в расте отсутствует выброс исключений?
От: T4r4sB Россия  
Дата: 05.12.22 16:38
Оценка: 8 (1)
Здравствуйте, flаt, Вы писали:

F>Это они выпилили поддержку Windows 7 не так давно (против чего было много возмущений, но в расте сидят хиппи и им лень поддерживать старые ОС).


Не хиппи, а хипстеры, не путай.
Старадающие той же хернёй, что и хаскеллисты, только в мягкой форме — когда теоретическая чистота идеи, даже если она постоянно вставляет палки в колёса в реальном коде, важнее практичности.
Просто у функциональщиков это совсем упоротость за гранью, но у растаманов тоже есть.

Про аборт в х32 режиме я им сам мозг выносил: https://internals.rust-lang.org/t/std-abort-should-be-implemented-through-exit-3-on-win32-mode/16059
К чему привело — хз, потому что я написал свой перехват и с ним и живу.

    std::panic::set_hook(Box::new(|info| {
        use backtrace::Backtrace;
        let bt = Backtrace::new();
        println!("{:#?}", info);
        println!("{:?}", bt);
        println!("exit(3)");
        std::process::exit(3);
    }));
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[3]: Почему в расте отсутствует выброс исключений?
От: Философ Ад http://vk.com/id10256428
Дата: 05.12.22 16:52
Оценка: -1 :)))
Здравствуйте, johny5, Вы писали:

J>Кстате обнаружил для себя panic!, оказывается он не убивает приложение а только текущий поток (ну и приложение если поток был главным).


Ваш раст делали идиоты. И в итоге сделали говно с дичайшими и лютейшими граблями. Постараюсь обходить и раст, и что-либо на нём сделанное, и что-либо использовавшее библиотеки на расте, или что-либо зависящее от чего-нибудь написанного на расте.

Если от меня когда-либо будет зависеть выбор софта, то я постараюсь прошерстить использованные инструменты и либы и рекомендую отказаться от кривого выбора при обнаружении. Себе дороже будет такое пропустить.


ЗЫ: точно такие же идиоты в шарпе https://learn.microsoft.com/ru-ru/dotnet/api/system.threading.thread.abort?view=net-7.0
это из-за таких же идиотом мы были вынуждены писать вот так:
protected SomeMethod()
{
try{}
finally{
    SomeInternalMethod()
}
}

private SomeInternalMethod(){
//do somthing
}
И точно такие же критины придумали TerminateThread() в винде.

Давил подобное, и буду давить, если встречу.
Всё сказанное выше — личное мнение, если не указано обратное.
Отредактировано 05.12.2022 17:17 Философ . Предыдущая версия .
Re[11]: Почему в расте отсутствует выброс исключений?
От: flаt  
Дата: 05.12.22 18:27
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Не хиппи, а хипстеры, не путай.


Нет, хиппи — у них там всё в розовом свете видится: https://i.redd.it/r213mixp563a1.jpg


TB>Про аборт в х32 режиме я им сам мозг выносил: https://internals.rust-lang.org/t/std-abort-should-be-implemented-through-exit-3-on-win32-mode/16059

TB>К чему привело — хз, потому что я написал свой перехват и с ним и живу.

Мне интересно, чем они думали, выпиливая Win7, если она у них всё ещё заявлена в Tier1 platform support?
https://doc.rust-lang.org/nightly/rustc/platform-support.html
Re[12]: Почему в расте отсутствует выброс исключений?
От: T4r4sB Россия  
Дата: 05.12.22 18:45
Оценка:
Здравствуйте, flаt, Вы писали:

F>Мне интересно, чем они думали, выпиливая Win7, если она у них всё ещё заявлена в Tier1 platform support?

F>https://doc.rust-lang.org/nightly/rustc/platform-support.html


Спроси на руст-интерналах. Но их дружное сообщество трудно переспорить. У них есть Идея.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[4]: Почему в расте отсутствует выброс исключений?
От: DarkEld3r  
Дата: 05.12.22 20:27
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>Ваш раст делали идиоты. И в итоге сделали говно с дичайшими и лютейшими граблями.


Я так понимаю, что подробностей и примеров граблей не будет?..

Ф>ЗЫ: точно такие же идиоты в шарпе https://learn.microsoft.com/ru-ru/dotnet/api/system.threading.thread.abort?view=net-7.0


В чём суть претензии? В наличии этого метода в принципе или в том, что аборт можно перехватить?
Re[5]: Почему в расте отсутствует выброс исключений?
От: T4r4sB Россия  
Дата: 05.12.22 20:38
Оценка:
Здравствуйте, DarkEld3r, Вы писали:

DE>Я так понимаю, что подробностей и примеров граблей не будет?..


Беззнаковые индексы и общий фанатизм по "типам, диапазон которых лучше всего представляет допустимые в данном контексте значения", что на деле только вынуждает пердолиться с кастами каждый раз когда нужно что-то сложить, или, боже упаси, вычесть.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[5]: Почему в расте отсутствует выброс исключений?
От: Философ Ад http://vk.com/id10256428
Дата: 06.12.22 09:09
Оценка:
Здравствуйте, DarkEld3r, Вы писали:

DE>Я так понимаю, что подробностей и примеров граблей не будет?..


А какие именно подробности тебе нужны? Незакрытых файлов, не освобождённых объектов синхронизации и инконсистентного состояния программы не достаточно? По-моему вполне. Потоки убивать нельзя!

Ф>>ЗЫ: точно такие же идиоты в шарпе https://learn.microsoft.com/ru-ru/dotnet/api/system.threading.thread.abort?view=net-7.0

DE>В чём суть претензии? В наличии этого метода в принципе или в том, что аборт можно перехватить?

Странно, что ты только про этот метод спросил, а вот про TerminateThread() умолчал. Претензия в том, что эта дрянь может кинуть исключение там, где его изначально в принципе не предполагалось, а то что оно может прервать статический конструктор и прервать инициализацию статических полей класса — это дикий трэш. Просто представь себе, что у тебя инициализируется глобальный экземпляр какой-нибудь сложной хрени, и в этот момент прилетает ThreadAbort — всё, приплыли: ты потом в жизни не разберёшься почему программа погоду на Марсе добывает вместо того чтобы работать.
Там кроме того что ты можешь написать на эту тему в самой BCL попадается, например:
    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
    internal class Resources {
        
        private static global::System.Resources.ResourceManager resourceMan;
Если ResourceManager инициализировался наполовину, то программа корректно уже не будет работать.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[6]: Почему в расте отсутствует выброс исключений?
От: DarkEld3r  
Дата: 06.12.22 09:19
Оценка: +1
Здравствуйте, T4r4sB, Вы писали:

TB>Беззнаковые индексы и общий фанатизм по "типам, диапазон которых лучше всего представляет допустимые в данном контексте значения", что на деле только вынуждает пердолиться с кастами каждый раз когда нужно что-то сложить, или, боже упаси, вычесть.


Я бы не сказал, что эти "грабли" исключительно растовая проблема. Да в целом тема достаточно спорная.
Re[7]: Почему в расте отсутствует выброс исключений?
От: T4r4sB Россия  
Дата: 06.12.22 09:26
Оценка:
Здравствуйте, DarkEld3r, Вы писали:

DE>Я бы не сказал, что эти "грабли" исключительно растовая проблема. Да в целом тема достаточно спорная.


Это скорее проблема большого количества фанатиков-теоретиков в растокоммюнити.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[6]: Почему в расте отсутствует выброс исключений?
От: DarkEld3r  
Дата: 06.12.22 09:35
Оценка: +2
Здравствуйте, Философ, Вы писали:

Ф>А какие именно подробности тебе нужны? Незакрытых файлов, не освобождённых объектов синхронизации и инконсистентного состояния программы не достаточно? По-моему вполне. Потоки убивать нельзя!


У меня складывается впечатление, что ты не разобрался, но уже начал громко орать. В расте нельзя "убить поток". Ну кроме как получив нативный хендл и сделав это средствами системного апи, но это можно сделать везде, где можно получить этот самый хендл и к языку оно отношения не имеет.

Паника, о которой говорилось выше — это просто "исключение", которое разматывает стек (есть альтернативный режим в котором паника — это немедленное завершение приложения). Никаких проблем при этом не возникает. Можно, конечно, писать код небезопасный к исключениям, но это везде так. И я бы сказал, что в расте это немного сложнее: повсеместно используется RAII и глобальное состояние не поощряется.

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

Ф>Странно, что ты только про этот метод спросил, а вот про TerminateThread() умолчал.


Честно говоря, я вообще не понял на что по ссылке надо обращать внимание, поэтому и переспросил. С .NET дела практически не имел. Спорить с тем, что прибить поток в произвольный момент ни к чему хорошему не приведёт я не буду.
Re[7]: Почему в расте отсутствует выброс исключений?
От: Философ Ад http://vk.com/id10256428
Дата: 06.12.22 09:50
Оценка:
Здравствуйте, DarkEld3r, Вы писали:

DE>У меня складывается впечатление, что ты не разобрался, но уже начал громко орать.


Я не разбирался — не пишу на расте, просто прочитал то что написал johny5. Написал он вот так:

Кстате обнаружил для себя panic!, оказывается он не убивает приложение а только текущий поток ...


DE>Паника, о которой говорилось выше — это просто "исключение", которое разматывает стек (есть альтернативный режим в котором паника — это немедленное завершение приложения).


Ах разматывает!!

DE>Когда-то давно панику можно было перехватить исключительно на границе потоков, а не в произвольный момент. Из-за этого периодически всплывает связь паники с потоками.


Ах можно перехватить!

DE>Честно говоря, я вообще не понял на что по ссылке надо обращать внимание, поэтому и переспросил. С .NET дела практически не имел. Спорить с тем, что прибить поток в произвольный момент ни к чему хорошему не приведёт я не буду.


По ссылке написано, что сейчас оно исключение кидает и больше ничего не делает.

Caution

Thread.Abort is not supported and throws PlatformNotSupportedException.


По-моему его вообще изначально не надо было добавлять — кроме вреда от него ничего больше не было.
Всё сказанное выше — личное мнение, если не указано обратное.
Отредактировано 06.12.2022 9:54 Философ . Предыдущая версия .
Re[6]: Почему в расте отсутствует выброс исключений?
От: ArtDenis Россия  
Дата: 06.12.22 11:19
Оценка: +2
Здравствуйте, Философ, Вы писали:

Ф>А какие именно подробности тебе нужны? Незакрытых файлов, не освобождённых объектов синхронизации и инконсистентного состояния программы не достаточно? По-моему вполне. Потоки убивать нельзя!


Объекты при этом освобождаются, файлы закрываются, объекты синхронизации "отравляются", инконсистентного состояния не наблюдается
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[8]: Почему в расте отсутствует выброс исключений?
От: DarkEld3r  
Дата: 06.12.22 11:22
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>Я не разбирался — не пишу на расте


Угу, не разбирался, но начал с громких заявлений:
> Ваш раст делали идиоты. И в итоге сделали говно с дичайшими и лютейшими граблями.

Ну а так в интернете чего только не пишут, не всё из этого правда.

Ф>Ах разматывает!!

Ф>Ах можно перехватить!

Не пойму к чему этот сарказм. Всё ещё видишь какие-то проблемы с паникой и/или потоками в расте?
Re[9]: Почему в расте отсутствует выброс исключений?
От: Философ Ад http://vk.com/id10256428
Дата: 06.12.22 11:25
Оценка:
Здравствуйте, DarkEld3r, Вы писали:

DE>Ну а так в интернете чего только не пишут, не всё из этого правда.


Ф>>Ах разматывает!!

Ф>>Ах можно перехватить!

DE>Не пойму к чему этот сарказм. Всё ещё видишь какие-то проблемы с паникой и/или потоками в расте?


Я вот даже не знаю чему тут теперь верить:

Объекты при этом освобождаются, файлы закрываются, объекты синхронизации "отравляются", инконсистентного состояния не наблюдается

http://rsdn.org/forum/rust/8422500.1
Автор: ArtDenis
Дата: 06.12.22


Наверное придётся проверять.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[10]: Почему в расте отсутствует выброс исключений?
От: ArtDenis Россия  
Дата: 06.12.22 11:47
Оценка: 3 (1)
Здравствуйте, Философ, Вы писали:

Ф>Наверное придётся проверять.


А в чём проблема-то проверить?

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=729d16deb284c9fa316c97ed9c57ae49
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[8]: Почему в расте отсутствует выброс исключений?
От: alex_public  
Дата: 06.12.22 12:48
Оценка:
Здравствуйте, vsb, Вы писали:

_>>Ну, то что ты описал — это как раз случай не исключительной ситуации, а обычной обработки ошибок и соответственно удобнее это обрабатывать не исключениями, а через Result.

vsb>Нет, удобней это обрабатывать именно исключениями. Т.к. при этом мне не нужно писать никакого кода.

Твоя фраза подразумевает, что при обработке с исключениями не надо писать какой-то код, который надо писать при обработке ошибок через Result в Rust'e. И т.к. это очевидно не код самой реакции на ошибку (который естественно надо писать в любом подходе и языке), то тогда о чём собственно речь? Или ты считаешь "дополнительным кодом" несколько знаков вопроса?

vsb>OOM в жаве это отдельная иерархия, но в целом — да, если отвечать на вопрос — пытается. И у него скорей всего получится, т.к. на нижнем уровне там всё используется в пулах преаллоцированных. Хотя, конечно, в условиях OOM всё будет плохо. У меня такой ситуации практически не бывает, но если про это задумываться, я при OOM предпочёл бы просто завершить процесс.


Именно! И как раз для таких ситуаций исключения (или паники) подходят идеально.

_>>А что именно неудобно в работе с Result?

vsb>Ну в го неудобно то, что там под каждым вызовом функции еще 3 строки на обработку err. В расте сахарок сделали, но всё равно везде Result-ы мусорят же. Зачем мне это видеть.

Ну тут есть довольно простой ответ, через встречный вопрос. ))) Вот допустим ты используешь механизм исключений для обработки обычных ошибок. Можешь ли ты взяв произвольную функцию в коде точно перечислить список ошибок, который она может вернуть?
Re[6]: Почему в расте отсутствует выброс исключений?
От: alex_public  
Дата: 06.12.22 12:59
Оценка:
Здравствуйте, Marty, Вы писали:

_>>Всё вышеописанное касается приложений написанных на любых языках. Но в большинстве языков есть один встроенный механизм обработки, который разработчики из-за незнания/неумения/безысходности используют для всех ситуаций. От этого и возникают все подобные неоднозначности и холивары.

_>>Rust же здесь выгодного отличается наличием двух отдельных механизмов, каждый под свою ситуацию. Паники для обработки исключительных ситуаций и Result для обычных ошибок.
M>Чем это отличается? Что мешает в C++? У меня для плюсов, кстати, написан свой Result. Иногда использую. Иногда нет. Иногда использую исключения, когда ошибку не исправить, но можно отловить на каком-то уровне и вывести пользователю или записать в лог и похромать дальше — что-то типа assert'а, только более контролируемого

В принципе я уже не раз говорил, что C++ и Rust почти что эквивалентные. Есть микронюансы, которые можно сделать на одном языке и нельзя на другом, а 99% возможностей пересекаются. Но это если говорить именно о возможности. Если же говорить об удобстве или традициях (существует ли общепринятая для языка практика под данному вопросу или же каждый делает как хочет), то тут уже возможна большая разница.

Если вернуться конкретно к вопросу работы с Result, то тут всё в точности как я описал выше. Создать подобный тип можно в обоих языках, но в Rust с ним будет удобнее работать из-за наличия двух синтаксических сахаров: развитого сопоставления с образцом и встроенного оператора "?". И плюс данный подход является общепринятым в сообществе, так что во всех библиотеках ты можешь видеть именно его и есть способы бесшовного автоматического склеивания их всех в единую стройную систему.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.