2016-08-22 72 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