如何处理这个异常呢?我的catch
没捕捉到)
我用MySQL.Data
与一切相互作用的一切都MySQL.Data
在try
,没有任何缺失await
。
但是,应用程序仍然会由于System.AggregateException
.
Необработанное исключение типа "System.AggregateException" в System.Private.CoreLib.dll
One or more errors occurred.
System.AggregateException
HResult=0x80131500
Сообщение = One or more errors occurred. (Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.)
Источник = System.Private.CoreLib
Трассировка стека:
в System.Threading.CancellationTokenSource.ExecuteCallbackHandlers(Boolean throwOnFirstException) в /_/src/libraries/System.Private.CoreLib/src/System/Threading/CancellationTokenSource.cs:строка 724
в System.Threading.TimerQueueTimer.Fire(Boolean isThreadPool) в /_/src/libraries/System.Private.CoreLib/src/System/Threading/Timer.cs:строка 669
в System.Threading.TimerQueue.FireNextTimers() в /_/src/libraries/System.Private.CoreLib/src/System/Threading/Timer.cs:строка 331
в System.Threading.ThreadPoolWorkQueue.Dispatch() в /_/src/libraries/System.Private.CoreLib/src/System/Threading/ThreadPoolWorkQueue.cs:строка 924
в System.Threading.PortableThreadPool.WorkerThread.WorkerThreadStart() в /_/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.WorkerThread.cs:строка 77
Внутреннее исключение 1:
MySqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
Внутреннее исключение 2:
TimeoutException: The operation has timed out.
在 InnerExeptions[0].StackTrace 中:
в MySql.Data.Common.StreamCreator.<>c.<GetTcpStreamAsync>b__8_1()
в System.Threading.CancellationTokenSource.Invoke(Delegate d, Object state, CancellationTokenSource source) в /_/src/libraries/System.Private.CoreLib/src/System/Threading/CancellationTokenSource.cs:строка 977
в System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) в /_/src/libraries/System.Private.CoreLib/src/System/Threading/ExecutionContext.cs:строка 179
--- Конец трассировки стека из предыдущего расположения ---
в System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) в /_/src/libraries/System.Private.CoreLib/src/System/Threading/ExecutionContext.cs:строка 203
в System.Threading.CancellationTokenSource.ExecuteCallbackHandlers(Boolean throwOnFirstException) в /_/src/libraries/System.Private.CoreLib/src/System/Threading/CancellationTokenSource.cs:строка 806
UPD
我无法提供我的用例。
但即使在如此简单的构造中也不会捕获异常:
while (true)
{
try
{
using MySqlConnection? _mySqlConnection = new MySqlConnection
{
ConnectionString = connectionStringBuilder.ToString()
};
await _mySqlConnection.OpenAsync();
}
catch (AggregateException ae)
{
foreach (Exception exception in ae.InnerExceptions)
{
Debug.WriteLine(exception);
}
}
catch (Exception ex)
{
Debug.WriteLine(ex);
}
await Task.Delay(1000);
}
UPD
我切换到 MySqlConnector - 我不必对代码进行任何更改,航班正常。
在这种情况下,不是您忘记了 catch,而是 MySQL.Data 库的作者。从堆栈来看,当超时到期时,他们尝试向服务器发送一些命令来取消请求,但由于超时已到期而失败。
一个经典的错误处理错误。而且,由于这一切都发生在处理超时时,因此它发生在池线程中,您将不会捕获异常。
我可以建议您实现稳定播放并向作者发送错误报告,同时切换到具有高质量驱动程序的普通 DBMS。例如,在 Postgres 上。
UPD:这是出现错误的行:https://github.com/mysql/mysql-connector-net/blob/7456bd102cc4193d61b12f82312b3db063aacea1/MySQL.Data/src/common/StreamCreator.cs#L111
他们不仅仅是错过了来自 CancellationToken.Register 的异常,他们还出于某种原因故意将其扔在那里!就好像从 Register 抛出异常将停止异步操作一样。
该库的作者根本不明白他在做什么,也从未检查过他的代码。这无法解决,请使用另一个 DBMS。作为最后的手段,分叉库并重写它。