Как извлечь основную ошибку из Failure Error? - PullRequest
0 голосов
/ 10 мая 2019

При попытке открыть испорченный файл epub / ZIP с помощью epub-rs ошибка ящика zip-rs (которая не использует Failure) переносится в failure::Error с помощью epub-rs.Я хочу обработать каждый тип ошибки zip-ов с помощью отдельного обработчика ошибок и мне нужен способ сопоставления с основной ошибкой.Как я могу получить его из Failure?

fn main() {
    match epub::doc::EpubDoc::new("a.epub") {
        Ok(epub) => // do something with the epub
        Err(error) => {
            // handle errors
        }
    }
}

error.downcast::<zip::result::ZipError>() не удается, а error.downcast_ref() возвращает None.

1 Ответ

2 голосов
/ 11 мая 2019

Вы можете выполнить переход из Failure Error в другой тип, который реализует Fail, используя одну из трех функций:

use failure; // 0.1.5
use std::{fs, io};

fn generate() -> Result<(), failure::Error> {
    fs::read_to_string("/this/does/not/exist")?;
    Ok(())
}

fn main() {
    match generate() {
        Ok(_) => panic!("Should have an error"),
        Err(e) => match e.downcast_ref::<io::Error>() {
            Some(e) => println!("Got an io::Error: {}", e),
            None => panic!("Could not downcast"),
        },
    }
}

В вашем конкретном случае, я предполагаю, что вы либо сталкиваетесь с несовпадающими версиями зависимостей (см. Почему черта не реализована для типа, в котором она явно реализована? для примеров и методов, какотследить это) или что вы просто получаете неправильный тип ошибки.Например, отсутствующий файл на самом деле является std::io::Error:

// epub = "1.2.0"
// zip = "0.4.2"
// failure = "0.1.5"

use std::io;

fn main() {
    if let Err(error) = epub::doc::EpubDoc::new("a.epub") {
        match error.downcast_ref::<io::Error>() {
            Some(i) => println!("IO error: {}", i),
            None => {
                panic!("Other error: {} {:?}", error, error);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...