【发布时间】:2021-03-15 21:54:23
【问题描述】:
我喜欢 Stephen Cleary 的新 logging pattern 测试。但是,有一些我不明白的地方:
不幸的是,这里的解决方案不适用于异步代码。这是因为异步会导致异常被捕获,然后在等待时重新抛出。因此,异常过滤器在等待点而不是最初引发异常的位置运行。
我想举一个例子,因为我的代码似乎对我来说很好用 Handle(...)/his True(...) 而没有 throw;。
我故意让SubscribeAsync 抛出异常。
public async Task StartAsync(CancellationToken cancellationToken)
{
try
{
await SubscribeAsync().ConfigureAwait(false);
}
catch (Exception ex) when (Handle(() => _logger.LogError(ex, "Unexpected error.")))
{
}
}
public static class ExceptionFilterUtility
{
public static bool Handle(Action action)
{
action();
return true;
}
public static bool Propagate(Action action)
{
action();
return false;
}
}
我的堆栈跟踪是:
[2021-03-13 20:16:32 Error] ElonMuskBot.Core.TradeManagers.LiveTradeManager
Unexpected error.
ElonMuskBot.Core.Exceptions.RequestFailedException: Error while subscribing to the Spot candlestick update stream
at ElonMuskBot.Core.Clients.SpotBotClient.SubscribeToCandleUpdatesAsync(String symbol, KlineInterval timeInterval, Action`1 onMessage) in E:\GitHub\elonmuskbot\src\ElonMuskBot.Core\Clients\SpotBotClient.cs:line 88
at ElonMuskBot.Core.TradeManagers.LiveTradeManager.SubscribeAsync() in E:\GitHub\elonmuskbot\src\ElonMuskBot.Core\TradeManagers\LiveTradeManager.cs:line 54
at ElonMuskBot.Core.TradeManagers.LiveTradeManager.StartAsync(CancellationToken cancellationToken) in E:\GitHub\elonmuskbot\src\ElonMuskBot.Core\TradeManagers\LiveTradeManager.cs:line 38
【问题讨论】:
-
你声称“没问题”的输出是......
-
@CaiusJard,我没明白你的意思。
-
你的异常的堆栈跟踪是什么?
-
@CaiusJard,i.imgur.com/NXEQwVr.png,这是正确的。它就在那里。
-
我从未见过 SO 强制执行字符限制,但鉴于您在屏幕截图中只显示了大约 6 行,您清楚地掌握了“演示所需的合理数据量是多少点”,所以在将文本编辑到问题中时,请随意做出相同的判断
标签: c#