Console.SetError(myTextWriter) 什么都不做

Console.SetError(myTextWriter) does nothing

我试图找到一种方法来处理未处理的异常。我找到了下一个 .

services.AddSingleton<ExceptionNotificationService>();
...
public class ExceptionNotificationService : TextWriter
{
    private TextWriter _decorated;
    public override Encoding Encoding => Encoding.UTF8;

    public event EventHandler<string> OnException;

    public ExceptionNotificationService()
    {
        _decorated = Console.Error;
        Console.SetError(this);
    }

    public override void WriteLine(string value)
    {
        OnException?.Invoke(this, value);

        _decorated.WriteLine(value);
    }
}

我检查了这段代码,它没有任何改变。异常正在写入浏览器控制台,方法 WriteLine(string value) 根本没有执行。我确定 Console.SetError(this) 已被执行。为什么它什么都不做?

因为我不知道如何实现一个原因,我开始尝试下一个不可思议的事情

  1. Console.SetError(this) 更改为 Console.SetOut(this)

确实有变化。我在浏览器控制台中收到 1000 条错误并且应用程序未启动。

  1. _decorated = Console.Error 更改为 _decorated = Console.Out 我在浏览器控制台中收到 1000 条信息,但应用程序没有再次启动。

很遗憾,我无法得出任何结论,除了Console.SetError在WebAssembly中被破坏而Console.SetOut是可以的。

I check this code, it doesn't change anything

在您发布的版本中,错误会转发给 _decorated.WriteLine(value);,因此 'no change' 是预期的结果。
但是,当您删除该行时,它们仍然会出现,这很奇怪。我刚用 v3.2 测试过。

except that Console.SetError is broken

不,不是。你可以这样测试

 Console.Error.WriteLine($"Current count {currentCount}");

通过您覆盖的 WriteLine 就好了。

但是 according to GitHub 错误现在写入记录器,而不是(直接)写入控制台。自发布其他答案以来,这是一个变化。您可能会在错误之前看到 crit:,即 LogLevel。

现在我不知道如何重新配置​​日志记录,这可能是另一个要问的问题。