我试图找到一种处理未处理异常的方法。我发现了下一个Blazor客户端应用程序级异常处理。
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)
已被执行。为什么它什么都不做?
因为我不知道如何实现一个原因,我开始尝试下一个不可思议的事情
- 将
Console.SetError(this)
更改为Console.SetOut(this)
它会改变。我在浏览器控制台中收到1000个错误,应用程序未启动。
- 将
_decorated = Console.Error
更改为_decorated = Console.Out
我在浏览器控制台中得到了1000个信息,应用程序没有再次启动
很遗憾,我不能得出任何结论,除了Console.SetError
在WebAssembly中坏了,Console.SetOut
还可以。
我检查了这个代码,它没有改变任何
在您发布的版本中,错误将转发给_decorated.WriteLine(value);
,因此"无更改"是预期结果
但是,当您删除该行时,它们仍然会出现,这很奇怪。我刚刚用v3.2进行了测试。
除了控制台。SetError已损坏
不,不是。你可以像一样测试它
Console.Error.WriteLine($"Current count {currentCount}");
通过重写的WriteLine的。
但根据GitHub的说法,错误现在被写入Logger,而不是(直接(写入控制台。这是另一个答案发布后的变化。您可能会在出现错误之前看到crit:
,即LogLevel。
现在我不知道如何重新配置日志记录,这可能是这里要问的另一个问题。