代码之家  ›  专栏  ›  技术社区  ›  Joshua

如何清除C#中的错误号?

  •  3
  • Joshua  · 技术社区  · 6 年前

    如何清除 errno .NET 核心?

    Marshal.GetLastWin32Error() 但没有明显的方法来设定或清除它。谷歌搜索毫无用处。 Marshal.SetLastError() 不存在。

    我好像写不出一个P/Invoke . 它是线程静态本机变量。

    如果你想知道为什么有人会想设置它,看到了吗 man 3 readdir . API特别要求设置 0

    本机代码就是这样的:

    errno = 0;
    struct dirent *entry = readdir(dir);
    if (entry == NULL && errno != 0) {
         /* Handle error */
    }
    

    .NET 代码:

    ????
    IntPtr entry NativeMethods.readdir(dir);
    if (entry == IntPtr.Zero && Marshal.GetLastWin32Error() != 0) {
        throw new IOException();
    }
    

    如果代码在哪里????会被省略,这就得到了伪错误。

    我想,如果我完全陷入困境,我可以做一些愚蠢的事情,比如用一个明确的错误代码做一些失败的事情,然后检查那个错误代码,但是在很多情况下,我们可以完全排除一个容易产生的特定错误。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Joshua    6 年前

    所以答案是????真的什么都不是只有在.NET内核上。它在.NETFramework和Mono上的行为不同。

    https://github.com/dotnet/corefx/issues/17198

    这是.NETCore上有意的不同之处 https://github.com/dotnet/coreclr/pull/614