Marshal.GetExceptionCode() 的替代方法是什么?

3

Marshal.GetExceptionCode()已被弃用,并且该消息没有建议的解决方法。

目前,我在以下开源项目中使用它:

https://github.com/dbones-labs/auditable/blob/master/src/Auditable/AuditableContext.cs#L143

这个想法是,如果客户端代码/应用程序在using块内引发异常,则不应该写日志。

然而,项目代码只有一个using语句来确定它是否应该作出反应。

有什么替代方法?(不改变调用代码的API)

API的示例用法https://dbones-labs.github.io/auditable/quick-examples/aspnet-example.html#3-add-some-auditable-logs


@dbones +1 我帮不了你,但这是一个非常不错的技巧。我不知道。如果在异常期间调用Dispose(),我从未必须以不同的方式处理它。但仍然很有趣。 - xanatos
@xanatos 我认为 SEHException 仍然会被抛出,你可以将 try 放在内部。 - Charlieface
@Charlieface 但是当你在 Dispose() 中时,你不知道是否有 SEHException “在空中”。 - xanatos
1
@dbones看起来在这里,完整的检查需要两个步骤:Marshal.GetExceptionPointers()!= IntPtr.Zero || Marshal.GetExceptionCode()!=0;。第一种方法不会被废弃...你可以试试看是否足够。 - xanatos
嗯,可能正是那段代码让他们决定停用它 :) 不,它完全没有实现承诺的功能,只有(较小的)一些异常情况会产生非零结果。更糟糕的是,它无法帮助客户程序员诊断其代码中的严重错误。它实际上避免了多少“它在你的日志中出现,所以是你的 bug”报告?不要这样做。 - Hans Passant
显示剩余5条评论
1个回答

1

从一个快速测试来看,似乎你可以使用Marshal.GetExceptionPointers()

public class MyDisposable : IDisposable
{
    public void Dispose()
    {
        var ptr = Marshal.GetExceptionPointers();
        Console.WriteLine(ptr);
    }
}

try
{
    using (new MyDisposable())
    {
    }

    using (new MyDisposable())
    {
        throw new Exception();
    }
}
catch (Exception)
{
}

using (new MyDisposable())
{
}

如果"在空中"存在异常,则为非零。
请注意,`Marshal.GetExceptionPointers()`一直存在于.NET Framework中,但仅在.NET Core >= 3.0中重新引入。因此,在.NET Core 1.0-2.2中,您需要使用`Marshal.GetExceptionCode()`。

好的,我会看一下这个(我不想引入编译器指令)。 - dbones
1
我会在这个工作正常之后接受它。 - dbones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接