Size: a a a

2020 November 23

АГ

Алексей Герасимов... in Rust Beginners
Andrej Kiselev
Всем доброго времени суток. Возник вопрос по оборачиванию ошибок, а именно создание кастомной ошибки, которая склеивает все остальные. У меня есть мой enum с кастомными ошибками:

#[derive(Debug, PartialEq)]
pub enum DaoError {
   DieselError(diesel::result::Error),
   DataError(DataError),
   ValidateError(ValidateError),
}

Есть функция, которая возвращает Result<String, DaoError> и она возвращает различные ошибки из enum DaoError:

fn f(..) -> Result<String, DaoError> {
   let v1 = make_query()?; // Возвращает Result(, diesel::result::Error);
   let v2 = validate()?; // Возвращает Result(, ValidateError);
   let v3 = find(); // Возвращает Option()

  v3.ok_or(DataError::NotFoundErr).map(|v| v.my_string)
}

Сначала компилятор ругался на то, что не может различные ошибки в DaoError, но затем я реализовал From trait для всех ошибок в DaoError. НО, почему-то в последней строчке он ругается на то, что возвращается Result<, DataError>, а ожидается Result<, DaoError>. Почему он не может сконвертировать DataError в DaoError как в предыдущих строчках?

Если написать:

v3.ok_or(DaoError::DataError(DataError::NotFoundErr)).map(|v| v.my_string)

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

Я читал еще, что можно не городить обертки над ошибками и использовать Box<error>, но там теряются типы ошибок, что(наверное) не очень хорошо...
потому что конвертацию ошибки осуществляет оператор ?, а в последней строке он не используется
источник

АГ

Алексей Герасимов... in Rust Beginners
Ok(v3.ok_or(DataError::NotFoundErr).map(|v| v.my_string)?)
источник

А⚙

Антон ⚙️ in Rust Beginners
Andrej Kiselev
Всем доброго времени суток. Возник вопрос по оборачиванию ошибок, а именно создание кастомной ошибки, которая склеивает все остальные. У меня есть мой enum с кастомными ошибками:

#[derive(Debug, PartialEq)]
pub enum DaoError {
   DieselError(diesel::result::Error),
   DataError(DataError),
   ValidateError(ValidateError),
}

Есть функция, которая возвращает Result<String, DaoError> и она возвращает различные ошибки из enum DaoError:

fn f(..) -> Result<String, DaoError> {
   let v1 = make_query()?; // Возвращает Result(, diesel::result::Error);
   let v2 = validate()?; // Возвращает Result(, ValidateError);
   let v3 = find(); // Возвращает Option()

  v3.ok_or(DataError::NotFoundErr).map(|v| v.my_string)
}

Сначала компилятор ругался на то, что не может различные ошибки в DaoError, но затем я реализовал From trait для всех ошибок в DaoError. НО, почему-то в последней строчке он ругается на то, что возвращается Result<, DataError>, а ожидается Result<, DaoError>. Почему он не может сконвертировать DataError в DaoError как в предыдущих строчках?

Если написать:

v3.ok_or(DaoError::DataError(DataError::NotFoundErr)).map(|v| v.my_string)

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

Я читал еще, что можно не городить обертки над ошибками и использовать Box<error>, но там теряются типы ошибок, что(наверное) не очень хорошо...
Покажи текст ошибки целиком
источник

(L

(((Mike Lubinets))) in Rust Beginners
Andrej Kiselev
Всем доброго времени суток. Возник вопрос по оборачиванию ошибок, а именно создание кастомной ошибки, которая склеивает все остальные. У меня есть мой enum с кастомными ошибками:

#[derive(Debug, PartialEq)]
pub enum DaoError {
   DieselError(diesel::result::Error),
   DataError(DataError),
   ValidateError(ValidateError),
}

Есть функция, которая возвращает Result<String, DaoError> и она возвращает различные ошибки из enum DaoError:

fn f(..) -> Result<String, DaoError> {
   let v1 = make_query()?; // Возвращает Result(, diesel::result::Error);
   let v2 = validate()?; // Возвращает Result(, ValidateError);
   let v3 = find(); // Возвращает Option()

  v3.ok_or(DataError::NotFoundErr).map(|v| v.my_string)
}

Сначала компилятор ругался на то, что не может различные ошибки в DaoError, но затем я реализовал From trait для всех ошибок в DaoError. НО, почему-то в последней строчке он ругается на то, что возвращается Result<, DataError>, а ожидается Result<, DaoError>. Почему он не может сконвертировать DataError в DaoError как в предыдущих строчках?

Если написать:

v3.ok_or(DaoError::DataError(DataError::NotFoundErr)).map(|v| v.my_string)

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

Я читал еще, что можно не городить обертки над ошибками и использовать Box<error>, но там теряются типы ошибок, что(наверное) не очень хорошо...
Ты действительно возвращаешь DataError.
Используй либо ?-operator, который автоматически применит From, либо .map_err(DaoError::from)
источник

AK

Andrej Kiselev in Rust Beginners
@geraleks @mersinvald спасибо большое, ребят. Все работает, это помогло. Для читаемости решил использовать DaoError::from(DataError::NotFoundErr)
источник
2020 November 24

JM

John Meow in Rust Beginners
r/itswooooshwith4os
источник

SH

Stas Hehera in Rust Beginners
привет ребят, как можно клонировать Box<dyn std::error::Error + Sync + Send>?
источник

MB

Mikail Bagishov in Rust Beginners
Никак. Можно в Arc разве что завернуть
источник

SH

Stas Hehera in Rust Beginners
а как можно принимать в функцию дженерик и чтобы можно было передать Box<std::error::Error + Send + Sync>?
источник

r

red75prime in Rust Beginners
Stas Hehera
а как можно принимать в функцию дженерик и чтобы можно было передать Box<std::error::Error + Send + Sync>?
foo<E: ?Sized + std::error::Error>(e: Box<E>) Опционально добавить Send и Sync к баундам
источник

A

Adatan in Rust Beginners
Как сделать кросскомпиляцию на win 10 для ubuntu? (через крейт cross, или rustc)
источник

IB

Ilya Bogdanov in Rust Beginners
Adatan
Как сделать кросскомпиляцию на win 10 для ubuntu? (через крейт cross, или rustc)
Может быть использовать WSL?
источник

A

Adatan in Rust Beginners
Ilya Bogdanov
Может быть использовать WSL?
я новичок, не знаю что это такое
источник

IB

Ilya Bogdanov in Rust Beginners
загугли, гуглится легко
источник

A

Adatan in Rust Beginners
мне говорили через это, кросскомпилить можно легко
https://github.com/rust-embedded/cross
источник

A

Adatan in Rust Beginners
Ilya Bogdanov
загугли, гуглится легко
а, я вспомнил что это, а просто кросскомпилировать, как в Go, например, не получиться?
источник

r

red75prime in Rust Beginners
Adatan
а, я вспомнил что это, а просто кросскомпилировать, как в Go, например, не получиться?
Компилировать получится (если сишных зависимостей нет). Собрать бинарник/so без кросс-линкера не получится.
источник

JC

Julian =) Coffee in Rust Beginners
Ну в расте же линкер можно поставить прямо из растапа, нет?
источник

A

Adatan in Rust Beginners
ну да
источник

IB

Ilya Bogdanov in Rust Beginners
ИМХО кросскомпиляция не нужна в век дешевых CI и вездесущих докер-контейнеров (кроме embedded, конечно)
источник