2016-08-22 73 views
1

在我小小的Rust程序中,我打電話給一個Windows API,並要確保一切正常。爲了做到這一點,我使用了std::io::Error::last_os_error()提供的功能。我也想故意忽略可能發生的一些錯誤。如何才能匹配std :: io ::錯誤與Windows錯誤代碼?

我找不到任何有關如何做的信息,除了打印出該函數返回的Error。我真正需要的是一種能夠處理各種已知錯誤的匹配聲明。

我知道該函數返回一個std::io::Error結構,但我找不到關於錯誤ID或類似概念的任何信息。

目前,我的代碼讀起來就像

use std::io::Error; 

fn main() { 
    // do some stuff that may lead to an error 

    match Error::last_os_error() { 
     163 => // Do nothing. This error is to be expected 
     // _ => Err("Something went wrong "), 
    } 
} 

實際的問題是,last_os_error()返回一個錯誤結構,但我想匹配的是在WinError.h中列出的錯誤的ID(這個程序只運行在Windows下)。

任何人都可以幫助我區分錯誤結構背後的各種錯誤嗎?

+1

@Shepmaster你是對的。這篇文章寫得很差。爲此道歉。也許這是我的問題的一部分。我甚至很難找到正確的詞,描述我的問題。我剛剛編輯了這篇文章,希望我的問題現在變得更加清晰。 – Norbert

回答

1

您可以使用得到原來的錯誤代碼,然後對陣是:

match Error::last_os_error().raw_os_error() { 
    Some(163) => {} // Do nothing. This error is to be expected 
    Some(e) => panic!("Unknown OS error {}", e), 
    None => panic!("Not an OS error!"), 
} 

這是這是否是一個好主意,或者不是一個不同的問題。你可以also match against known error types。我建議儘可能使用它。您可能還想創建(或查找)將各種錯誤代碼映射到人類可讀值的枚舉,因爲它很容易說明您的意思是NotEnoughMemory而不是SecurityDescriptorInvalid,這比分辨123132的區別要容易得多。

+0

感謝您的回答!我想這是我一直在尋找的功能。不幸的是,在運行代碼時,我現在得到以下錯誤: 線程'

'在'Err'值上調用'Result :: unwrap()'時發生panicked:MissingNulError(Some([99,58,92,116 ,101,115,116,92,116,101,115,116,46,116,120,116]))',../src/libcore\result.rs:785 這似乎不涉及使用恐慌!宏觀,但前線。 – Norbert

+0

@諾伯特似乎是屬於一個單獨的問題。我們更喜歡不同的問題,因爲這可以讓其他人自己找到問題和答案。你會*看看問題的標題「我如何匹配一個Windows錯誤代碼的std :: io ::錯誤」來理解MissingNulError是什麼?在提出新問題時,請確保您生成另一個[MCVE],包括*只需*生成錯誤所需的代碼。 – Shepmaster

+1

對不起,我的錯。我認爲這個錯誤與你在帖子中建議的解決方案有關,但在第二次看後,這顯然不是這種情況。我想我會在問另一個問題之前先試着弄清楚自己。謝謝! – Norbert