Error handling 如何使用Windows错误代码匹配std::io::错误?

Error handling 如何使用Windows错误代码匹配std::io::错误?,error-handling,rust,match,Error Handling,Rust,Match,在我的小Rust程序中,我正在调用一个Windows API,希望确保一切正常。为此,我使用了std::io::Error::last\u os\u Error()提供的功能。我还想故意忽略一些可能发生的错误 除了打印出该函数返回的错误之外,我找不到关于如何执行该操作的任何信息。我实际上需要的是一种match语句,在其中我可以处理各种已知错误 我知道该函数返回一个std::io::Errorstruct,但我找不到关于错误ID或类似概念的任何信息 目前,我的代码如下所示 use std::io:

在我的小Rust程序中,我正在调用一个Windows API,希望确保一切正常。为此,我使用了std::io::Error::last\u os\u Error()提供的功能。我还想故意忽略一些可能发生的错误

除了打印出该函数返回的
错误
之外,我找不到关于如何执行该操作的任何信息。我实际上需要的是一种match语句,在其中我可以处理各种已知错误

我知道该函数返回一个
std::io::Error
struct,但我找不到关于错误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\u os\u error()
返回一个错误结构,但我想匹配WinError.h中列出的错误ID(此程序仅在Windows下运行)

有谁能帮助我区分这种匹配语句中错误结构背后的各种错误吗?

您可以使用获取原始错误代码,然后与之匹配:

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!"),
}


这是一个不同的问题,这是否是一个好主意。你可以。我建议在可能的情况下使用它。您可能还希望创建(或查找)一个枚举,将各种错误代码映射到人类可读的值,因为与区分
123
132

@Shepmaster您是对的相比,更容易判断您的意思是
NotEnoughMemory
而不是
SecurityDescriptorInvalid
。这篇文章写得真糟糕。对此表示歉意。也许这是我问题的一部分。我甚至很难找到正确的词语来描述我的问题。我刚刚编辑了这篇文章,希望我的问题现在变得更清楚。谢谢你的回答!我想这就是我一直在寻找的功能。不幸的是,在运行代码时,我现在遇到了以下错误:线程“在调用
Result::unwrap()
时惊慌失措”(在
Err
值上:MissingNulError(一些([99,58,92,116,116,101,115,116,92,116,101,115,116,46,116,120,116]),../src/libcore\Result.rs:785这似乎与惊慌失措的使用无关!宏,但与前面的行一致。@Norbert,这似乎属于另一个问题。我们喜欢不同的问题,因为这使其他人能够自己找到问题和答案。请看一个题为“如何用Windows错误代码匹配std::io::Error”的问题,以了解什么是
MissingNulError
?请确保在提出新问题时生成另一个问题,包括生成错误所需的代码。对不起,是我的错。我认为这个错误与你在文章中建议的解决方案有关,但在仔细看了之后,情况显然不是这样。我想在问另一个问题之前,我会先自己弄清楚。谢谢