Size: a a a

2021 March 02

RB

Roman Blog in rust_offtopic
Ну это просто "ну там что-то паникует" без подробностей. К тому же, ты это не мне пиши. Мне то как раз от этого лучше. Я исходил из того, что выше цировалось всё.
источник

p

polunin.ai in rust_offtopic
А о чем спор? Паники = исключения?
источник

ΑZ

Αλεχ Zhukovsky in rust_offtopic
короче опять спор терминологический
источник

ΑZ

Αλεχ Zhukovsky in rust_offtopic
это скорее в плюсах паники, а не в расте эксепшны
источник

ΑZ

Αλεχ Zhukovsky in rust_offtopic
эксепшны это как в джаве
источник

ΑZ

Αλεχ Zhukovsky in rust_offtopic
а в С++ не эксепшны
источник

RB

Roman Blog in rust_offtopic
polunin.ai
А о чем спор? Паники = исключения?
Ну спор о том, что @Psilon говорил о том, что какие-то там либы воспринимают исключения как что-то, чего не может быть. Все вокруг воспринимают паники за аборты и не думают об их обработке.

Я же говорю о том, что а) никто про об этом не думает. б) если бы думали, то либы бы запрещали себе кидать исключения, если подобное поведение для них неприемлемо. Т.е. требовали бы panic=abort, либо ловили исключения и сами вызывали abort
источник

D

Dima in rust_offtopic
Алексей
что там ломается из-за рекавери?
ну можешь попробовать убрать catch_unwind а потом запустить что-то такое
use crossbeam::thread;

fn main() {

   thread::scope(|s| {

       s.spawn(|_| {
           let var = vec![3,2,1];

           thread::scope(|s| {
               s.spawn(|_| {
                   println!("A child thread borrowing `var`: {:?}", var);
               });
               panic!();
           });
           panic!();
       });
   }).unwrap();
}

возможно ты получишь
thread '<unnamed>' panicked at 'explicit panic', src/main.rs:14:17
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Segmentation fault (core dumped)
источник

D

Dima in rust_offtopic
pub fn scope<'env, F, R>(f: F) -> thread::Result<R>
where
   F: FnOnce(&Scope<'env>) -> R,
{
   let wg = WaitGroup::new();
   let scope = Scope::<'env> {
       handles: SharedVec::default(),
       wait_group: wg.clone(),
       _marker: PhantomData,
   };

   // Execute the scoped function, but catch any panics.
   //let result = panic::catch_unwind(panic::AssertUnwindSafe(|| f(&scope)));

   let result = f(&scope);

   // Wait until all nested scopes are dropped.
   drop(scope.wait_group);
   wg.wait();

   // Join all remaining spawned threads.
   let panics: Vec<_> = scope
       .handles
       .lock()
       .unwrap()
       // Filter handles that haven't been joined, join them, and collect errors.
       .drain(..)
       .filter_map(|handle| handle.lock().unwrap().take())
       .filter_map(|handle| handle.join().err())
       .collect();

   // If `f` has panicked, resume unwinding.
   // If any of the child threads have panicked, return the panic errors.
   // Otherwise, everything is OK and return the result of `f`.
   /*match result {
       Err(err) => panic::resume_unwind(err),
       Ok(res) => {
           if panics.is_empty() {
               Ok(res)
           } else {
               Err(Box::new(panics))
           }
       }
   }*/
   Ok(result)
}
источник

А

Алексей in rust_offtopic
Dima
ну можешь попробовать убрать catch_unwind а потом запустить что-то такое
use crossbeam::thread;

fn main() {

   thread::scope(|s| {

       s.spawn(|_| {
           let var = vec![3,2,1];

           thread::scope(|s| {
               s.spawn(|_| {
                   println!("A child thread borrowing `var`: {:?}", var);
               });
               panic!();
           });
           panic!();
       });
   }).unwrap();
}

возможно ты получишь
thread '<unnamed>' panicked at 'explicit panic', src/main.rs:14:17
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Segmentation fault (core dumped)
так я же не спрашивал что будет если убрать catch_unwind, я спрашивал, что ужасного случится, если оставить
источник

D

Dima in rust_offtopic
Алексей
так я же не спрашивал что будет если убрать catch_unwind, я спрашивал, что ужасного случится, если оставить
А, я тогда не правильно понял, просто я приводил пример того что иногда не ловить паники нельзя
источник

RB

Roman Blog in rust_offtopic
на тему С++ и исключений. https://godbolt.org/z/h8a9ae - вот пример того, о чём я говорил. Там вызовы rt для создания исключений можно заменить своими реализациями и просто кидать abort. В остальном всё работает так же.
Скорее всего, в расте сделано так же. И там не генерируется другой код при panic=abort, как в ситуации с fno-exceptions в С++
источник

ΑZ

Αλεχ Zhukovsky in rust_offtopic
Roman Blog
Ну спор о том, что @Psilon говорил о том, что какие-то там либы воспринимают исключения как что-то, чего не может быть. Все вокруг воспринимают паники за аборты и не думают об их обработке.

Я же говорю о том, что а) никто про об этом не думает. б) если бы думали, то либы бы запрещали себе кидать исключения, если подобное поведение для них неприемлемо. Т.е. требовали бы panic=abort, либо ловили исключения и сами вызывали abort
ненене
источник

ΑZ

Αλεχ Zhukovsky in rust_offtopic
если бы думали, то либы бы запрещали себе кидать исключения,
источник

ΑZ

Αλεχ Zhukovsky in rust_offtopic
это не так
источник

IN

Irek Nigmatullin in rust_offtopic
Αλεχ Zhukovsky
Привет, интересный вопрос, из коробки не видел такого. Но можешь реализовать сам, вроде нетрудно, если контент-ленгтш не врет
Контентленг тут не причём. Понадобилось мне это при реализации миделвари которая проверяет эцп боди. надо считать боди параллельно сливая его на фс, (если порог размера боди в памяти превышен) вычислить эцп, далее передать уже следующему, стрим который смотрит в файл*
источник

RB

Roman Blog in rust_offtopic
Αλεχ Zhukovsky
это не так
ну как не как. Ты либо запрещаешь, либо не запрещаешь. Либо в принципе об этом не думаешь. Третьего варианта нет. Я утвержадю, что в 99% случаев это "не думаешь", а в 1% случаев "не запрещаешь"
источник

ΑZ

Αλεχ Zhukovsky in rust_offtopic
Irek Nigmatullin
Контентленг тут не причём. Понадобилось мне это при реализации миделвари которая проверяет эцп боди. надо считать боди параллельно сливая его на фс, (если порог размера боди в памяти превышен) вычислить эцп, далее передать уже следующему, стрим который смотрит в файл*
ну я говорил про простой случай когда посмотрели на контент-лентгш и либо в память пишем либо на диск.

если есть стрим неизвестной длины то все усложняется, уверен что такое нигде не реализовано, хотя могу ошибатсья
источник

А

Алексей in rust_offtopic
Roman Blog
ну как не как. Ты либо запрещаешь, либо не запрещаешь. Либо в принципе об этом не думаешь. Третьего варианта нет. Я утвержадю, что в 99% случаев это "не думаешь", а в 1% случаев "не запрещаешь"
ну не во всех ситуациях может быть только два варианта
источник

RB

Roman Blog in rust_offtopic
Алексей
ну не во всех ситуациях может быть только два варианта
Ну какие ещё есть варианты? Запрет противоречит наблюдаемой реальности, потому как он предполагает запрет, чего мы не наблюдаем
источник